考え方
状態:試行錯誤中
閲覧数:1,560
投稿日:2013-08-08
更新日:2013-08-24
現状DBテーブル
・「Date_Table」テーブル
今後
・「Date_Table」テーブル
・「2013-8-9」テーブル
・「2013-8」テーブル
※日付毎に「日」「月」テーブル作成
・「Date_Table」テーブル
今後
・「Date_Table」テーブル
・「2013-8-9」テーブル
・「2013-8」テーブル
※日付毎に「日」「月」テーブル作成
プリファレンス保存 … 処理の流れ
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()メソッドを使用
処理の流れ … エントリーベース
エントリー
▼/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();//実際に保存
処理の流れ …ダウンロードベース
概要
▼/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;
}
「部分コピペ作成コード」ベース
問題
「月」「日」テーブルが作成されない
▼/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