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の呼び出し部分は上から三番目のソース内の「//その月日の金額をまとめる」というコメントがついてる部分です。
調べてもいまいちわからなかったのでよろしければご助言お願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/06 07:20
2019/01/10 01:25