質問編集履歴

2 文法の修正

Aies

Aies score 21

2019/01/06 16:23  投稿

getApplicationContextのnull object reference
```AndroidStudio
public class MainActivity extends AppCompatActivity {
   private TextView textView;
   private EditText editTextKey, editTextValue;
   private KakeiboDatabase kDB;
   private SQLiteDatabase db;
   
   public String readData(String date) {
       if(kDB == null){
           kDB = new KakeiboDatabase(getApplicationContext());
       }
       if(db == null){
           db = kDB.getReadableDatabase();
       }
       Cursor cursor = db.query(
               "kakeibodb",
               new String[] { "SUM(price)" },
               "date=" + date,
               null,
               null,
               null,
               null
       );
       cursor.moveToFirst();
       String price = cursor.getString(0);
       
       cursor.close();
       return price;
   }
}
```
```AndroidStudio
public class KakeiboDatabase extends SQLiteOpenHelper {
   // データーベースのバージョン
   private static final int DATABASE_VERSION = 1;
   // データーベース名
   private static final String DATABASE_NAME = "KakeiboDB.db";
   private static final String TABLE_NAME = "kakeibodb";
   private static final String PRIMARY_KEY = "date";
   private static final String COLUMN_CATEGORY = "category";
   private static final String COLUMN_PRICE= "price";
   private static final String COLUMN_MEMO = "memo";
   private static final String _ID = "_id";
   private KakeiboDatabase kDB;
   private SQLiteDatabase db;
   private static final String SQL_CREATE_ENTRIES =
           "CREATE TABLE " + TABLE_NAME + " (" +
                   _ID + " INTEGER," +
                   PRIMARY_KEY + " TEXT," +
                   COLUMN_CATEGORY + " TEXT," +
                   COLUMN_PRICE + " INTEGER," +
                   COLUMN_MEMO + " TEXT," +
                   "PRIMARY KEY(" + _ID + "," + PRIMARY_KEY + "))";
   private static final String SQL_DELETE_ENTRIES =
           "DROP TABLE IF EXISTS " + TABLE_NAME;
   KakeiboDatabase(Context context) {
       super(context, DATABASE_NAME, null, DATABASE_VERSION);
   }
   @Override
   public void onCreate(SQLiteDatabase db) {
       // テーブル作成
       // SQLiteファイルがなければSQLiteファイルが作成される
       db.execSQL(
               SQL_CREATE_ENTRIES
       );
       Log.d("debug", "onCreate(SQLiteDatabase db)");
   }
   @Override
   public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
       // アップデートの判別
       db.execSQL(
               SQL_DELETE_ENTRIES
       );
       onCreate(db);
   }
   public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
       onUpgrade(db, oldVersion, newVersion);
   }
}
```
```AndroidStudio
public class CalendarAdapter extends BaseAdapter {
       private List<Date> dateArray = new ArrayList();
       private Context mContext;
       private DateManager mDateManager;
       private LayoutInflater mLayoutInflater;
       private String price;
       private SQLiteDatabase db;
       private KakeiboDatabase kDB;
       //カスタムセルを拡張したらここでWigetを定義
       private static class ViewHolder {
           public TextView dateText;
       }
       public CalendarAdapter(Context context){
           mContext = context;
           mLayoutInflater = LayoutInflater.from(mContext);
           mDateManager = new DateManager();
           dateArray = mDateManager.getDays();
       }
       @Override
       public int getCount() {
           return dateArray.size();
       }
       @Override
       public View getView(int position, View convertView, ViewGroup parent) {
           ViewHolder holder;
           if (convertView == null) {
               convertView = mLayoutInflater.inflate(R.layout.calendar_cell, null);
               holder = new ViewHolder();
               holder.dateText = convertView.findViewById(R.id.dateText);
               convertView.setTag(holder);
           } else {
               holder = (ViewHolder)convertView.getTag();
           }
           //セルのサイズを指定
           float dp = mContext.getResources().getDisplayMetrics().density;
           AbsListView.LayoutParams params = new AbsListView.LayoutParams(parent.getWidth()/7 - (int)dp, (parent.getHeight() - (int)dp * mDateManager.getWeeks() ) / mDateManager.getWeeks());
           convertView.setLayoutParams(params);
           //その月日の金額をまとめる
           SimpleDateFormat dateF = new SimpleDateFormat("yyyy-MM-dd", Locale.JAPAN);
           MainActivity main = new MainActivity();
           price = main.readData(dateF.format(dateArray.get(position)));
           //日付とデータベースの金額を表示させる
           SimpleDateFormat dateFormat = new SimpleDateFormat("d", Locale.JAPAN);
           holder.dateText.setText(dateFormat.format(dateArray.get(position)) + "\n" + price);
           //当月以外のセルをグレーアウト
           if (mDateManager.isCurrentMonth(dateArray.get(position))){
               convertView.setBackgroundColor(Color.WHITE);
           }else {
               convertView.setBackgroundColor(Color.LTGRAY);
           }
           //日曜日を赤、土曜日を青に
           int colorId;
           switch (mDateManager.getDayOfWeek(dateArray.get(position))){
               case 1:
                   colorId = Color.RED;
                   break;
               case 7:
                   colorId = Color.BLUE;
                   break;
               default:
                   colorId = Color.BLACK;
                   break;
           }
           holder.dateText.setTextColor(colorId);
           return convertView;
       }
       @Override
       public long getItemId(int position) {
           return 0;
       }
       @Override
       public Object getItem(int position) {
           return null;
       }
       //表示月を取得
       public String getTitle(){
           SimpleDateFormat format = new SimpleDateFormat("yyyy.MM", Locale.US);
           SimpleDateFormat format = new SimpleDateFormat("yyyy.MM", Locale.JAPAN);
           return format.format(mDateManager.mCalendar.getTime());
       }
       //翌月表示
       public void nextMonth(){
           mDateManager.nextMonth();
           dateArray = mDateManager.getDays();
           this.notifyDataSetChanged();
       }
       //前月表示
       public void prevMonth(){
           mDateManager.prevMonth();
           dateArray = mDateManager.getDays();
           this.notifyDataSetChanged();
   }
}
```
この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の呼び出し部分は上から三番目のソース内の「//その月日の金額をまとめる」というコメントがついてる部分です。  
 
調べてもいまいちわからなかったのでよろしければご助言お願いいたします。
  • SQLite

    1415 questions

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

  • Android Studio

    6721 questions

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

1 データソースの追記

Aies

Aies score 21

2019/01/06 16:12  投稿

getApplicationContextのnull object reference
```AndroidStudio
public class MainActivity extends AppCompatActivity {
   private TextView textView;
   private EditText editTextKey, editTextValue;
   private KakeiboDatabase kDB;
   private SQLiteDatabase db;
   
   public String readData(String date) {
       if(kDB == null){
           kDB = new KakeiboDatabase(getApplicationContext());
       }
       if(db == null){
           db = kDB.getReadableDatabase();
       }
       Cursor cursor = db.query(
               "kakeibodb",
               new String[] { "SUM(price)" },
               "date=" + date,
               null,
               null,
               null,
               null
       );
       cursor.moveToFirst();
       String price = cursor.getString(0);
       
       cursor.close();
       return price;
   }
}
```
```AndroidStudio
public class KakeiboDatabase extends SQLiteOpenHelper {
   // データーベースのバージョン
   private static final int DATABASE_VERSION = 1;
   // データーベース名
   private static final String DATABASE_NAME = "KakeiboDB.db";
   private static final String TABLE_NAME = "kakeibodb";
   private static final String PRIMARY_KEY = "date";
   private static final String COLUMN_CATEGORY = "category";
   private static final String COLUMN_PRICE= "price";
   private static final String COLUMN_MEMO = "memo";
   private static final String _ID = "_id";
   private KakeiboDatabase kDB;
   private SQLiteDatabase db;
   private static final String SQL_CREATE_ENTRIES =
           "CREATE TABLE " + TABLE_NAME + " (" +
                   _ID + " INTEGER," +
                   PRIMARY_KEY + " TEXT," +
                   COLUMN_CATEGORY + " TEXT," +
                   COLUMN_PRICE + " INTEGER," +
                   COLUMN_MEMO + " TEXT," +
                   "PRIMARY KEY(" + _ID + "," + PRIMARY_KEY + "))";
   private static final String SQL_DELETE_ENTRIES =
           "DROP TABLE IF EXISTS " + TABLE_NAME;
   KakeiboDatabase(Context context) {
       super(context, DATABASE_NAME, null, DATABASE_VERSION);
   }
   @Override
   public void onCreate(SQLiteDatabase db) {
       // テーブル作成
       // SQLiteファイルがなければSQLiteファイルが作成される
       db.execSQL(
               SQL_CREATE_ENTRIES
       );
       Log.d("debug", "onCreate(SQLiteDatabase db)");
   }
   @Override
   public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
       // アップデートの判別
       db.execSQL(
               SQL_DELETE_ENTRIES
       );
       onCreate(db);
   }
   public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
       onUpgrade(db, oldVersion, newVersion);
   }
}
```
```AndroidStudio  
public class CalendarAdapter extends BaseAdapter {  
       private List<Date> dateArray = new ArrayList();  
       private Context mContext;  
       private DateManager mDateManager;  
       private LayoutInflater mLayoutInflater;  
       private String price;  
       private SQLiteDatabase db;  
       private KakeiboDatabase kDB;  
 
       //カスタムセルを拡張したらここでWigetを定義  
       private static class ViewHolder {  
           public TextView dateText;  
       }  
 
       public CalendarAdapter(Context context){  
           mContext = context;  
           mLayoutInflater = LayoutInflater.from(mContext);  
           mDateManager = new DateManager();  
           dateArray = mDateManager.getDays();  
       }  
 
       @Override  
       public int getCount() {  
           return dateArray.size();  
       }  
 
       @Override  
       public View getView(int position, View convertView, ViewGroup parent) {  
           ViewHolder holder;  
           if (convertView == null) {  
               convertView = mLayoutInflater.inflate(R.layout.calendar_cell, null);  
               holder = new ViewHolder();  
               holder.dateText = convertView.findViewById(R.id.dateText);  
               convertView.setTag(holder);  
           } else {  
               holder = (ViewHolder)convertView.getTag();  
           }  
 
           //セルのサイズを指定  
           float dp = mContext.getResources().getDisplayMetrics().density;  
           AbsListView.LayoutParams params = new AbsListView.LayoutParams(parent.getWidth()/7 - (int)dp, (parent.getHeight() - (int)dp * mDateManager.getWeeks() ) / mDateManager.getWeeks());  
           convertView.setLayoutParams(params);  
 
           //その月日の金額をまとめる  
           SimpleDateFormat dateF = new SimpleDateFormat("yyyy-MM-dd", Locale.JAPAN);  
           MainActivity main = new MainActivity();  
           price = main.readData(dateF.format(dateArray.get(position)));  
 
           //日付とデータベースの金額を表示させる  
           SimpleDateFormat dateFormat = new SimpleDateFormat("d", Locale.JAPAN);  
           holder.dateText.setText(dateFormat.format(dateArray.get(position)) + "\n" + price);  
 
           //当月以外のセルをグレーアウト  
           if (mDateManager.isCurrentMonth(dateArray.get(position))){  
               convertView.setBackgroundColor(Color.WHITE);  
           }else {  
               convertView.setBackgroundColor(Color.LTGRAY);  
           }  
 
           //日曜日を赤、土曜日を青に  
           int colorId;  
           switch (mDateManager.getDayOfWeek(dateArray.get(position))){  
               case 1:  
                   colorId = Color.RED;  
                   break;  
               case 7:  
                   colorId = Color.BLUE;  
                   break;  
 
               default:  
                   colorId = Color.BLACK;  
                   break;  
           }  
           holder.dateText.setTextColor(colorId);  
 
           return convertView;  
       }  
 
       @Override  
       public long getItemId(int position) {  
           return 0;  
       }  
 
       @Override  
       public Object getItem(int position) {  
           return null;  
       }  
 
       //表示月を取得  
       public String getTitle(){  
           SimpleDateFormat format = new SimpleDateFormat("yyyy.MM", Locale.US);  
           return format.format(mDateManager.mCalendar.getTime());  
       }  
 
       //翌月表示  
       public void nextMonth(){  
           mDateManager.nextMonth();  
           dateArray = mDateManager.getDays();  
           this.notifyDataSetChanged();  
       }  
 
       //前月表示  
       public void prevMonth(){  
           mDateManager.prevMonth();  
           dateArray = mDateManager.getDays();  
           this.notifyDataSetChanged();  
   }  
}  
 
```  
この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()); のところです。
調べてもいまいちわからなかったのでよろしければご助言お願いいたします。
  • SQLite

    1415 questions

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

  • Android Studio

    6721 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る