日付テーブル作成 … 作成編7

アプリ ソースコード家計簿アプリ

考え方

 状態:試行錯誤中  閲覧数:1,472  投稿日:2013-08-08  更新日:2013-08-24
現状DBテーブル
・「Date_Table」テーブル

今後
・「Date_Table」テーブル
・「2013-8-9」テーブル
・「2013-8」テーブル
※日付毎に「日」「月」テーブル作成

プリファレンス保存 … 処理の流れ

 閲覧数:438 投稿日:2013-08-17 更新日:2013-08-28

1.SharedPreferences型インスタンス


SharedPreferences型オブジェクト(インスタンス)は、ContextクラスのgetSharedPreferences()メソッドで取得
・getSharedPreferences()の第一引数は、プリファレンスの名前(プリファレンス自体に名前を付ける)
・これは、保存するキーの名前とは異なる
・一つのプリファレンスに対し、いくつかのキーが存在するので、保存するデータの親になるようなイメージ

・getSharedPreferences()の第二引数は共有モードです。以下の値を指定できる
・MODE_WORLD_READABLE:他のアプリから読み取り可能
・MODE_WORLD_WRITEABLE:他のアプリから書込み可能
MODE_PRIVATE:そのアプリケーションだけで使用可能
・他のアプリから読み取りも書込みも可能にするには、サンプルコードのように論理和で結合

データ読込
・保存されているデータ型により、getString()、getFloat()、getInt()、getLong()、getBoolean()等を使い分ける
・今回は、Int型なので、getInt()を使用
・第2引数は、もしそのキーの値が存在しないときの初期値とする値を指定
・もし、誤った型を指定すると、ClassCastExceptionが発生


2.Editor型インスタンス


SharedPreferencesのedit()メソッドでEditor型インスタンスを取得
・このEditorインスタンスを通じて、プリファレンスへのデータの書込みを実施
・書き込むデータの型により、putString()、putFloat()、putInt()、putLong()、putBoolean()等を使い分ける

データ書込
・今回は、Int型なので、putInt()を使用
・第1引数はキー名で、第2引数は値


3.実際に保存


データ型
・保存するデータ型は、boolean型、float型、int型、long型、String型の何れか
・Editorのcommit()メソッドを使用

処理の流れ … エントリーベース

 閲覧数:424 投稿日:2013-08-17 更新日:2013-08-28

エントリー


▼/src/com/fc2/blog98/andromaker/housekeepingbook/SubOpenHelper.java
・onCreateメソッド
final Calendar calendar = Calendar.getInstance();
final int year = calendar.get(Calendar.YEAR);//CalendarクラスのYEAR(年)を取得
final int month = calendar.get(Calendar.MONTH);//CalendarクラスのMONTH(月)を取得
final int day = calendar.get(Calendar.DAY_OF_MONTH);//CalendarクラスのDAY_OF_MONTH(日)を取得
String tablename = String.valueOf(year)+"-"+String.valueOf(month+1)+"-"+String.valueOf(day);//String.valueOfメソッドで、整数を文字列に変換。月はなぜか値が最初は-1されてるので、+1


テーブル名は日付固定
▼/src/com/fc2/blog98/andromaker/housekeepingbook/HousekeepingBook.java
・onCreateメソッド
String sql = "";
sql += "create table "+"_"+tablename+"_"+" (";
sql += "_id integer primary key";
sql += ",Koumoku text not null";
sql += ",Utiwake text";
sql += ",Kingaku text";
sql += ")";
db.execSQL(sql);
}


プリファレンスで条件分岐するよう修正
▼/src/com/fc2/blog98/andromaker/housekeepingbook/HousekeepingBook.java
・onCreateメソッド
String prefname=String.valueOf(year)+"-"+String.valueOf(month+1);
SharedPreferences pref = getSharedPreferences(prefname,//getSharedPreferences()メソッドでSharedPreferences型インスタンスを取得。第一引数は、プリファレンスの名前
       MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE);//他アプリから読み取りも書込みも可能
   int str = pref.getInt(tablename, 0);//データ読込。第2引数 … キーの値が存在しないときの初期値とする値
               if(str==0){
[テーブル作成のコード]
]
      Editor e = pref.edit();//Editor型インスタンスを取得
e.putInt(tablename, 1);//データ書込。第1引数 … キー名。第2引数 … 値
e.commit();//実際に保存


処理の流れ …ダウンロードベース

 閲覧数:398 投稿日:2013-08-19 更新日:2013-08-27

概要


▼/src/com/fc2/blog98/andromaker/housekeepingbook/SubOpenHelper.java
・onCreateメソッド
        final Calendar calendar = Calendar.getInstance();
       final int year = calendar.get(Calendar.YEAR);//未利用
       final int month = calendar.get(Calendar.MONTH);//未利用
       final int day = calendar.get(Calendar.DAY_OF_MONTH);//未利用


▼/src/com/fc2/blog98/andromaker/housekeepingbook/HousekeepingBook.java
・onCreateメソッド
createTable();


・createTableメソッド
	public void createTable(){
String[] fileName=intentFileName();
SharedPreferences pref = getSharedPreferences(fileName[0],MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE);//getSharedPreferences()メソッドでSharedPreferences型インスタンスを取得。第一引数は、プリファレンスの名前。第二引数は共有モード、他アプリから読み取りも書込みも可能
int str = pref.getInt(fileName[1], 0);//データ読込。第2引数 … キーの値が存在しないときの初期値とする値
if(str==0){
String sql = "";
sql += "create table "+"'"+fileName[1]+"'"+" (";
sql += "_id integer primary key";
sql += ",Item text not null";
sql += ",Utiwake text";
sql += ",Kingaku text";
sql += ")";
SQLiteDatabase db=database();
db.execSQL(sql);
}
Editor e = pref.edit();//Editor型インスタンスを取得
e.putInt(fileName[1], 1);//データ書込。第1引数 … キー名。第2引数 … 値
e.commit();//実際に保存
}


・intentFileNameメソッド
	public String[] intentFileName(){
int[] calendar=intentCalendar();
       //第一引数はキー。第二引数はキーが存在しなかった場合の戻り値。
       String prefName="pref";
       String tableName=String.valueOf(calendar[0])+"-"+String.valueOf(calendar[1]+1)+"-"+String.valueOf(calendar[2]);//String.valueOfメソッドで、整数を文字列に変換
       String tableMonthName=String.valueOf(calendar[0])+"-"+String.valueOf(calendar[1]+1);
       String[] fileName={prefName,tableName,tableMonthName};
       return fileName;
}


・intentCalendarメソッド
	public int[] intentCalendar(){
Calendar calendar = Calendar.getInstance();//Calendarクラスのオブジェクトcalendarを生成
int year = calendar.get(Calendar.YEAR);//CalendarクラスのYEAR(年) … 現在の年を取得
int month = calendar.get(Calendar.MONTH);//CalendarクラスのMONTH(月) … 現在の月を取得
int day = calendar.get(Calendar.DAY_OF_MONTH);//CalendarクラスのDAY_OF_MONTH(日) … 年の何番目の日かを取得
Intent intent1 = getIntent();
year = intent1.getIntExtra("year",year);
month = intent1.getIntExtra("month",month);
day = intent1.getIntExtra("day",day);
int date= year*10000+(month+1)*100+day;//月はなぜか値が最初は-1されてるので、+1
int[] calendarIntent={year,month,day,date};
return calendarIntent;
}


「部分コピペ作成コード」ベース

 閲覧数:388 投稿日:2013-08-24 更新日:2013-08-27

問題


「月」「日」テーブルが作成されない
▼/src/android/style/householdaccount/MainActivity.java
・createTableメソッド
・条件分岐をコメントアウトすると作成される
・なぜ?
	public void createTable(){
String[] fileName=intentFileName();
SharedPreferences pref = getSharedPreferences(fileName[0],MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE);//getSharedPreferences()メソッドでSharedPreferences型インスタンスを取得。第一引数は、プリファレンスの名前。第二引数は共有モード、他アプリから読み取りも書込みも可能
int str = pref.getInt(fileName[1], 0);//データ読込。第2引数 … キーの値が存在しないときの初期値とする値
// if(str==0){
String sql = "";
sql += "create table "+"'"+fileName[1]+"'"+" (";
sql += "_id integer primary key";
sql += ",Item text not null";
sql += ",Utiwake text";
sql += ",Kingaku text";
sql += ")";
SQLiteDatabase db=database();
db.execSQL(sql);
// }
Editor e = pref.edit();//Editor型インスタンスを取得
e.putInt(fileName[1], 1);//データ書込。第1引数 … キー名。第2引数 … 値
e.commit();//実際に保存
}



原因判明


・プレファレンスxmlファイルに既に保存されていたから
# cd /data/data/android.style.householdaccount/shared_prefs
cd /data/data/android.style.householdaccount/shared_prefs
# ls
ls
pref.xml
# cat /data/data/android.style.householdaccount/shared_prefs/pref.xml
cat /data/data/android.style.householdaccount/shared_prefs/pref.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<int name="2013-8-20" value="1" />
<int name="2013-8-16" value="1" />
<int name="2013-8-9" value="1" />
<int name="2013-8-8" value="1" />
<int name="2013-8" value="1" />
<int name="2013-8-7" value="1" />
<int name="2013-8-17" value="1" />
<int name="2013-8-1" value="1" />
<int name="2013-8-18" value="1" />
<int name="2013-8-19" value="1" />
</map>



対応


・一旦、プレファレンスxmlファイル後、DB名を新規設定すれば良い
※このプロジェクトでは意図的に「pref.xml」「DBテーブル」を連動させている! テストのため片方だけ削除する場合は要注意!
# rm /data/data/android.style.householdaccount/shared_prefs/pref.xml
rm /data/data/android.style.householdaccount/shared_prefs/pref.xml

・「月」「日」テーブルが無事作成されていることを確認
# sqlite3 test.db15
sqlite3 test.db15
SQLite version 3.6.22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .table
.table
2013-8            2013-8-20         Date_Table        android_metadata



「adb shell」コマンド

1.「ダウンロードソースコード」仕様



週間人気ページランキング / 5-12 → 5-18
順位 ページタイトル抜粋 アクセス数
アクセスが、ありませんでした! 0
2024/5/19 1:01 更新