質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

3824閲覧

getApplicationContextのnull object reference

Aies

総合スコア21

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2019/01/05 22:20

編集2019/01/06 07:23

AndroidStudio

1public class MainActivity extends AppCompatActivity { 2 3 private TextView textView; 4 private EditText editTextKey, editTextValue; 5 private KakeiboDatabase kDB; 6 private SQLiteDatabase db; 7 8 9 public String readData(String date) { 10 if(kDB == null){ 11 kDB = new KakeiboDatabase(getApplicationContext()); 12 } 13 14 if(db == null){ 15 db = kDB.getReadableDatabase(); 16 } 17 18 Cursor cursor = db.query( 19 "kakeibodb", 20 new String[] { "SUM(price)" }, 21 "date=" + date, 22 null, 23 null, 24 null, 25 null 26 ); 27 28 cursor.moveToFirst(); 29 30 String price = cursor.getString(0); 31 32 cursor.close(); 33 34 return price; 35 } 36}

AndroidStudio

1public class KakeiboDatabase extends SQLiteOpenHelper { 2 3 4 // データーベースのバージョン 5 private static final int DATABASE_VERSION = 1; 6 7 // データーベース名 8 private static final String DATABASE_NAME = "KakeiboDB.db"; 9 private static final String TABLE_NAME = "kakeibodb"; 10 private static final String PRIMARY_KEY = "date"; 11 private static final String COLUMN_CATEGORY = "category"; 12 private static final String COLUMN_PRICE= "price"; 13 private static final String COLUMN_MEMO = "memo"; 14 private static final String _ID = "_id"; 15 16 17 private KakeiboDatabase kDB; 18 private SQLiteDatabase db; 19 20 21 private static final String SQL_CREATE_ENTRIES = 22 "CREATE TABLE " + TABLE_NAME + " (" + 23 _ID + " INTEGER," + 24 PRIMARY_KEY + " TEXT," + 25 COLUMN_CATEGORY + " TEXT," + 26 COLUMN_PRICE + " INTEGER," + 27 COLUMN_MEMO + " TEXT," + 28 "PRIMARY KEY(" + _ID + "," + PRIMARY_KEY + "))"; 29 30 private static final String SQL_DELETE_ENTRIES = 31 "DROP TABLE IF EXISTS " + TABLE_NAME; 32 33 34 KakeiboDatabase(Context context) { 35 super(context, DATABASE_NAME, null, DATABASE_VERSION); 36 37 } 38 39 @Override 40 public void onCreate(SQLiteDatabase db) { 41 42 // テーブル作成 43 // SQLiteファイルがなければSQLiteファイルが作成される 44 db.execSQL( 45 SQL_CREATE_ENTRIES 46 ); 47 48 Log.d("debug", "onCreate(SQLiteDatabase db)"); 49 50 } 51 52 @Override 53 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 54 // アップデートの判別 55 db.execSQL( 56 SQL_DELETE_ENTRIES 57 ); 58 onCreate(db); 59 } 60 61 public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { 62 onUpgrade(db, oldVersion, newVersion); 63 } 64}

AndroidStudio

1public class CalendarAdapter extends BaseAdapter { 2 private List<Date> dateArray = new ArrayList(); 3 private Context mContext; 4 private DateManager mDateManager; 5 private LayoutInflater mLayoutInflater; 6 private String price; 7 private SQLiteDatabase db; 8 private KakeiboDatabase kDB; 9 10 //カスタムセルを拡張したらここでWigetを定義 11 private static class ViewHolder { 12 public TextView dateText; 13 } 14 15 public CalendarAdapter(Context context){ 16 mContext = context; 17 mLayoutInflater = LayoutInflater.from(mContext); 18 mDateManager = new DateManager(); 19 dateArray = mDateManager.getDays(); 20 } 21 22 @Override 23 public int getCount() { 24 return dateArray.size(); 25 } 26 27 @Override 28 public View getView(int position, View convertView, ViewGroup parent) { 29 ViewHolder holder; 30 if (convertView == null) { 31 convertView = mLayoutInflater.inflate(R.layout.calendar_cell, null); 32 holder = new ViewHolder(); 33 holder.dateText = convertView.findViewById(R.id.dateText); 34 convertView.setTag(holder); 35 } else { 36 holder = (ViewHolder)convertView.getTag(); 37 } 38 39 //セルのサイズを指定 40 float dp = mContext.getResources().getDisplayMetrics().density; 41 AbsListView.LayoutParams params = new AbsListView.LayoutParams(parent.getWidth()/7 - (int)dp, (parent.getHeight() - (int)dp * mDateManager.getWeeks() ) / mDateManager.getWeeks()); 42 convertView.setLayoutParams(params); 43 44 //その月日の金額をまとめる 45 SimpleDateFormat dateF = new SimpleDateFormat("yyyy-MM-dd", Locale.JAPAN); 46 MainActivity main = new MainActivity(); 47 price = main.readData(dateF.format(dateArray.get(position))); 48 49 //日付とデータベースの金額を表示させる 50 SimpleDateFormat dateFormat = new SimpleDateFormat("d", Locale.JAPAN); 51 holder.dateText.setText(dateFormat.format(dateArray.get(position)) + "\n" + price); 52 53 //当月以外のセルをグレーアウト 54 if (mDateManager.isCurrentMonth(dateArray.get(position))){ 55 convertView.setBackgroundColor(Color.WHITE); 56 }else { 57 convertView.setBackgroundColor(Color.LTGRAY); 58 } 59 60 //日曜日を赤、土曜日を青に 61 int colorId; 62 switch (mDateManager.getDayOfWeek(dateArray.get(position))){ 63 case 1: 64 colorId = Color.RED; 65 break; 66 case 7: 67 colorId = Color.BLUE; 68 break; 69 70 default: 71 colorId = Color.BLACK; 72 break; 73 } 74 holder.dateText.setTextColor(colorId); 75 76 return convertView; 77 } 78 79 @Override 80 public long getItemId(int position) { 81 return 0; 82 } 83 84 @Override 85 public Object getItem(int position) { 86 return null; 87 } 88 89 //表示月を取得 90 public String getTitle(){ 91 SimpleDateFormat format = new SimpleDateFormat("yyyy.MM", Locale.JAPAN); 92 return format.format(mDateManager.mCalendar.getTime()); 93 } 94 95 //翌月表示 96 public void nextMonth(){ 97 mDateManager.nextMonth(); 98 dateArray = mDateManager.getDays(); 99 this.notifyDataSetChanged(); 100 } 101 102 //前月表示 103 public void prevMonth(){ 104 mDateManager.prevMonth(); 105 dateArray = mDateManager.getDays(); 106 this.notifyDataSetChanged(); 107 } 108} 109

このMainActivityにあるreadDataを外部から呼び出したときに
【java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
at com.example.a162105.kakeibo.MainActivity.readData(MainActivity.java:33)】
というエラー文が出ます。

(MainActivity.java:33) は kDB = new KakeiboDatabase(getApplicationContext()); のところです。

readDataの呼び出し部分は上から三番目のソース内の「//その月日の金額をまとめる」というコメントがついてる部分です。

調べてもいまいちわからなかったのでよろしければご助言お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

例えば下記のようなコードで実行すると、やはりNullPointerExceptionで落ちます。

java

1public class MainActivity extends AppCompatActivity { 2 3 private Context mContext = getApplicationContext(); 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9 } 10}

onCreate()の開始以降でなければ、getApplicationContext()からは正常に値を取得することができません。readData()をどのように呼び出しているのか不明ですが、上記のコードに準じる書き方になっているのだろうと思います。

投稿2019/01/06 01:22

keicha_hrs

総合スコア6768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Aies

2019/01/06 07:20

回答ありがとうございます すみません。readDataを呼び出すコードを追記しました。 Mainactivity内で呼び出していないのでonCreateが書けなそうです。
Aies

2019/01/10 01:25

MainActivityにonCreateを作成してその中でgetApplicationContext()を呼び出したら無事できました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問