ãããã®å°é£ãªæ代ã®ãã¹ãŠã®ããã€ããã¡ãžã®æšæ¶ã
æ£çŽãªãšãããç¹èš±ãæŠäºãªã©ã«é¢ãããã®èªå€§åºåã¯ãããã£ãŠããŸãããããã®èšäºã§ã¯ããã«ã€ããŠã¯èª¬æããŸããã
ç§ã¯ãã®ãããã¯ã«é¢ããèšäºãæžãã€ããã¯ãããŸããã§ããããªããªããAndroidã§ããŒã¿ããŒã¹ãæäœããããšã«ã€ããŠã¯ãã¹ãŠããã£ã±ãã§ããããã¹ãŠãã·ã³ãã«ã«æããããã§ãããããããšã©ãŒãããŒã¿ããŒã¹åºæã®ãšã©ãŒããããã£ãŠãå®éã«ééããããã€ãã®ãã€ã³ããèæ
®ããŠãããã«å¯ŸåŠããã ãã®äººã
ã«èŠåãããããã®åé¡ã解決ãããããã¯ã«é¢ããã³ã¡ã³ããåŸ
ã£ãŠãããæçš¿ã«å€æŽãå ããäœæ¥ã®äŸãšãªãåªãããã¥ãŒããªã¢ã«ãäœæããŸãAndroidã§SQLiteã䜿çšããã®ã¯ãåå¿è
ã ãã§ãªãããã§ã«åºæ¬ã«ç²ŸéããŠãããç°¡åãªã¢ããªã±ãŒã·ã§ã³ãäœæããããšããã人ã«ãé©ããŠããŸãã
ããŒã¿ããŒã¹ãæäœããæ¹æ³ããŒã¿ããŒã¹å
ã®ããŒã¿ãæäœããã«ã¯ã次ã®3ã€ã®æ¹æ³ããããŸãã
1ïŒç©ºã®ããŒã¿ããŒã¹æ§é ãäœæããŸãã ãŠãŒã¶ãŒã¯ã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠäœæ¥ãïŒã¡ã¢ãäœæããåé€ããŸãïŒãããŒã¿ããŒã¹ããã£ã±ãã«ãªããŸãã äŸã¯ãdeveloper.android.comãã¢ãŸãã¯ããã€ãããã€ã¹ã®NotePadã§ãã
2ïŒã¢ããªã±ãŒã·ã§ã³ã§é
åžããå¿
èŠã®ããããŒã¿ã§æºããããæ¢è£œã®ããŒã¿ããŒã¹ããã§ã«æã£ãŠãããããã¡ã€ã«ã®ããŒã¿ãã¢ã»ããã«è§£æããŸãã
3ïŒå¿
èŠã«å¿ããŠããããã¯ãŒã¯ããããŒã¿ãåä¿¡ããŸãã
ä»ã«1ã€ãŸãã¯2ã€ã®æ¹æ³ãããå Žåã¯ããã®ãªã¹ããããªãã®å©ãã§åãã§è£è¶³ããŸãã
ãã¹ãŠã®ã¡ã€ã³ãã¥ãŒããªã¢ã«ã¯ãæåã®ã±ãŒã¹çšã«èšèšãããŠããŸãã 次ã®ããã«ãããŒã¿ããŒã¹æ§é ãäœæãããªã¯ãšã¹ããäœæããSQLiteOpenHelperã¯ã©ã¹ã®onCreateïŒïŒã¡ãœããã§ãã®ãªã¯ãšã¹ããå®è¡ããŸãã
class MyDBHelper extends SQLiteOpenHelper { final String CREATE_TABLE = "CREATE TABLE myTable(...)"; final String DB_NAME = "mySuperDB.db"; Context mContext; public MyDBHelper(Context context, int dbVer){ super(context, DB_NAME, null, dbVer); mContext = context; } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
ãã®ãããªãã®ã ã¯ã©ã¹ããã³ãã®ä»ã®ã³ã³ããŒãã³ãã®ããå®å
šãªããŒãžã§ã³ã¯ãèšäºã®äžéšã«ãããªã³ã¯ã§èŠã€ããããšãã§ããŸãã
ããã«ãonOpenïŒïŒãgetReadableDatabaseïŒïŒ/ getWritableDatabaseïŒïŒã¡ãœããããªãŒããŒã©ã€ãã§ããŸãããéåžžã¯äžèšã®ã¡ãœãããšããŒã¿ååŸã¡ãœããã§ååã§ãã
次ã«ããªã¯ãšã¹ããéå§ããŠå®è¡ãããšãã«ãã¢ããªã±ãŒã·ã§ã³ã§ãã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸããã€ãŸããåé¡éšåãæž¡ãããŸããã ãªãåé¡ãããã®ã§ããïŒ ãŠãŒã¶ãŒãåžå Žããã¢ããªã±ãŒã·ã§ã³ãããŠã³ããŒããããšãã圌ã¯ããªãã®ããŒã¿ããŒã¹ã«ã€ããŠèãããäœãèµ·ããåŸãªãããã§ãã ãããã¯ãŒã¯ããªããªã£ãããŸãã¯å¥ã®ããã»ã¹ãéå§ããããŸãã¯ãšã©ãŒã«ææãªã³ãŒããæžãããšããŸãããã
ãšããã§ã泚æãã䟡å€ããããã1ã€ã®ãã€ã³ãããããŸãã ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹å€æ°ãäœæããŠApplicationãªããžã§ã¯ãã«ä¿åããå¿
èŠã«å¿ããŠã¢ã¯ã»ã¹ã§ããŸãããããŒã¿ããŒã¹ãžã®åžžææ¥ç¶ã¯éããªãœãŒã¹ã§ãããããå¿ããã«closeïŒïŒã¡ãœãããåŒã³åºãå¿
èŠããããŸãã ããã«ãè€æ°ã®ã¹ã¬ããããããŒã¿ããŒã¹ãæäœãããšãã«è¡çªãçºçããå ŽåããããŸãã
ãã ããããšãã°ãããŒã¿ããŒã¹ã«ã¢ã¯ã»ã¹ããããã«å¿
èŠã«å¿ããŠãªããžã§ã¯ããäœæãããªã©ãå¥ã®æ¹æ³ããããŸãã ããã¯å¥œã¿ã®åé¡ã ãšæããŸããããããè°è«ããå¿
èŠããããŸãã
ãããŠä»ãæãéèŠãªããšã ã¢ããªã±ãŒã·ã§ã³å
ã®ããŒã¿ã§æ¢åã®ããŒã¿ããŒã¹ã䜿çšããå¿
èŠãããå Žåã¯ã©ããªããŸããïŒ
å°ãã°ãŒã°ã«ã§ãããã«ãã®ãããªãçŽ æŽãããèšäºãã«
åºäŒãã§ããã-www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applicationsã«ã¯ãèŠããšãããæ£ããäžèœè¬ããããŸãã ããããããã«ã¯ãããŸããã§ããã ãŸããããã€ãã®ãšã©ãŒããããŸãã
ããã«ãããŸãïŒ
1ïŒcreateDataBaseïŒïŒã¡ãœããã§ã次ã®è¡ïŒ
SQLiteDatabase dbRead = getReadableDatabaseïŒïŒ;ãããŠãã³ãŒãã«ã¯ãDesire NTSäžã®ã¯ã©ãã·ã¥ã¢ãââãªã±ãŒã·ã§ã³ãå«ãŸããŠããŸããããã¯ãèªã¿åãçšã®ããŒã¿ããŒã¹ãååŸããããïŒäœæãããŸãïŒãéããŸããã
è¡ã®äžã«dbRead.closeïŒïŒãè¿œå ãããšãä¿®æ£ã®æºåã¯ã§ããŠããŸããããã€ã³ãã¯è°è«ã®äœå°ããããŸãã
ããã¯ãgetReadableDatabaseïŒïŒã¡ãœããã«ã€ããŠèšã£ãŠããããšã¯æ¬¡ã®ãšããã§ãã
ããŒã¿ããŒã¹ãäœæããã³/ãŸãã¯éããŸãã ããã¯ããã£ã¹ã¯å
šäœãªã©ã®äœããã®åé¡ã§ããŒã¿ããŒã¹ãèªã¿åãå°çšã§éãå¿
èŠããªãéããgetWritableDatabaseïŒïŒã«ãã£ãŠè¿ããããã®ãšåããªããžã§ã¯ãã«ãªããŸãã ãã®å Žåãèªã¿åãå°çšã®ããŒã¿ããŒã¹ãªããžã§ã¯ããè¿ãããŸãã åé¡ãä¿®æ£ãããå ŽåãgetWritableDatabaseïŒïŒãžã®å°æ¥ã®åŒã³åºããæåããå¯èœæ§ããããŸãããã®å Žåãèªã¿åãå°çšããŒã¿ããŒã¹ãªããžã§ã¯ãã¯éããããèªã¿åã/æžã蟌ã¿ãªããžã§ã¯ãã¯å°æ¥è¿ãããŸãã
getWritableDatabaseïŒïŒãšåæ§ã«ããã®ã¡ãœããã¯æ»ãã®ã«é·ãæéããããå¯èœæ§ããããããContentProvider.onCreateïŒïŒãå«ãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ã¹ã¬ããããåŒã³åºããªãã§ãã ããããªã©ã ãã®ã¡ãœããã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ã¹ã¬ããã§åŒã³åºããªãã§ãã ããã ããã§ãªããã°ããã¹ãŠãæ確ã§ãã
2ïŒ
ãšã©ãŒïŒãã®ãããªããŒãã«android_metadataã¯ãããŸããã æçš¿ã®äœè
ã¯ãããŒã¿ããŒã¹ã«äºåã«ãã®ããŒãã«ãäœæããããšã§è±åºããŸããã ãããã©ã®çšåºŠæ£ãããã¯ããããŸãããããã®ããŒãã«ã¯åsqlite-dbã·ã¹ãã ã§äœæãããçŸåšã®ãã±ãŒã«ãå«ãŸããŠããŸãã
3ïŒ
ãšã©ãŒïŒããŒã¿ããŒã¹ãã¡ã€ã«ãéããŸããã 以äžã®ãªã³ã¯ããèªãããšãã§ããå€ãã®æèŠãç°ãªãæèŠããããŸãã
stackoverflow.com/questions/3563728/random-exception-android-database-sqlite-sqliteexception-unable-to-open-databasegroups.google.com/group/android-developers/browse_thread/thread/a0959c4059359d6fcode.google.com/p/android/issues/detail?id=949stackoverflow.com/questions/4937934/unable-to-open-database-file-on-device-htc-desireandroidblogger.blogspot.com/2011/02/instable-android-and-unable-to-open.htmlåé¡ã¯ã1ã€ã®ã¹ã¬ãããããŒã¿ããŒã¹ããããã¯ãã2çªç®ã®ã¹ã¬ãããããŒã¿ããŒã¹ã«ã¢ã¯ã»ã¹ã§ããªããšããäºå®ã«é¢é£ããŠããå¯èœæ§ããããŸãïŒã¢ããªã±ãŒã·ã§ã³ã®ã¢ã¯ã»ã¹æš©ã«åé¡ãããå¯èœæ§ããããŸãïŒ ãããšãã°Acerã¿ãã¬ãããªã©ïŒã ãã§ãªãããããããããªããããããã®åé¡ã¯ååšããŸãã
ã¡ã€ã³ã¹ã¬ããã§ããŒã¹ãäœæããããã®ã¡ãœãããåŒã³åºãããšã¯ãå§ãã§ããªããããåé¡ã¯ç¡é§ã§ã¯ãªãã¹ã¬ããã«ãããšããéžæè¢ã«åŸããŠããŸãã
ãããããããã«å¯Ÿãã解決çã¯æ¬¡ã®ããã«ãªããŸãïŒãªãã·ã§ã³2ãæ€èšãããŠããŸãïŒã æåã®ãªãã·ã§ã³ã䜿çšããŠããŒã¿ããŒã¹ãæäœããäœæåŸã«ããŒã¿ãå
¥åããŸãã次ã«äŸã瀺ããŸãã
@Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE); fillData(db); } private void fillData(SQLiteDatabase db) {
ãã®ã¢ãããŒãã¯å®éã«ãã¹ãããå¿
èŠããããŸããããã®æçš¿ã¯ãã®ãããã¯ã«é¢ããé©åãªéåçææ決å®ãéçºããããšãç®çãšããŠããããããã®ãããã¯ã«é¢ããã³ã¡ã³ããšãµã³ãã«ã¯å€§æè¿ã§ãã
ã¹ããŒãªãŒã®æèšã¯æ¬¡ã®ãšããã§ãããœãªã¥ãŒã·ã§ã³ã«é©ããã³ãŒããèŠã€ããããããããã§ãã¯ããŠããããžã§ã¯ãã«ã³ããŒããåã«æ zyã«ãªããªãã§ãã ããã
ãããã«äžè¬ã«ããã®æçš¿ã§ã¯ïŒæ¹æ³çªå·2ã«ã€ããŠïŒæ¹æ³ã瀺ããŸãããèå³æ·±ãèããããã€ãå«ãŸããŠããŸãã
getReadableDatabaseïŒïŒã¡ãœããã¯ãããšãã°æ¬¡ã®ããã«åå®çŸ©ã§ããŸãã
@Override public synchronized SQLiteDatabase getReadableDatabase() { //Log.d(Constants.DEBUG_TAG, "getReadableDatabase() called"); SQLiteDatabase db; try { db = super.getReadableDatabase(); } catch (SQLiteException e) { Log.d(Constants.DEBUG_TAG, e.getMessage()); File dbFile = myContext.getDatabasePath(DB_NAME); Log.d(Constants.DEBUG_TAG,"db path="+dbFile.getAbsolutePath()); //db = SQLiteDatabase.openDatabase( dbFile.getAbsolutePath(), null, SQLiteDatabase.NO_LOCALIZED_COLLATORS); db = SQLiteDatabase.openOrCreateDatabase(dbFile.getAbsolutePath(), null); } return db; }
ãã®ãããã¯ã«é¢ããåªãããã¥ãŒããªã¢ã«ã¯ãã¡ã
-www.vogella.de/articles/AndroidSQLite/article.htmlãšããã§ïŒãã©ãããã©ãŒã èªäœã®æ
£ç¿ã«åŸã£ãŠããã©ã€ããªããŒãã£ãŒã«ãã¯ã_idããšåŒã°ããã¹ãã§ãã
ããªãã®äœ¿çšããæ
£è¡ãã³ã¡ã³ãã«æžããŠãã ããã ç§ãã¡ã¯ãã®æçš¿ããã¹ãŠã®äººã«ãšã£ãŠããè¯ããã®ã«ããããããäžçã¯å°ã芪åã«ãªãã§ãããã
UPDã¡ããã©ç§ã®ã¢ãããŒãããã¹ãããŸããã ãã¹ãŠããšãã¥ã¬ãŒã¿ã§åäœããŸããã泚æããŠãã ããã
public class DBHelper extends SQLiteOpenHelper { final static int DB_VER = 1; final static String DB_NAME = "todo.db"; final String TABLE_NAME = "todo"; final String CREATE_TABLE = "CREATE TABLE "+TABLE_NAME+ "( _id INTEGER PRIMARY KEY , "+ " todo TEXT)"; final String DROP_TABLE = "DROP TABLE IF EXISTS "+TABLE_NAME; final String DATA_FILE_NAME = "data.txt"; Context mContext; public DBHelper(Context context) { super(context, DB_NAME, null, DB_VER); Log.d(Constants.DEBUG_TAG,"constructor called"); mContext = context; } @Override public void onCreate(SQLiteDatabase db) { Log.d(Constants.DEBUG_TAG,"onCreate() called"); db.execSQL(CREATE_TABLE); fillData(db); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL(DROP_TABLE); onCreate(db); } private ArrayList<String> getData() { InputStream stream = null; ArrayList<String> list = new ArrayList<String>(); try { stream = mContext.getAssets().open(DATA_FILE_NAME); } catch (IOException e) { Log.d(Constants.DEBUG_TAG,e.getMessage()); } DataInputStream dataStream = new DataInputStream(stream); String data = ""; try { while( (data=dataStream.readLine()) != null ) { list.add(data); } } catch (IOException e) { e.printStackTrace(); } return list; } private void fillData(SQLiteDatabase db){ ArrayList<String> data = getData(); for(String dt:data) Log.d(Constants.DEBUG_TAG,"item="+dt); if( db != null ){ ContentValues values; for(String dat:data){ values = new ContentValues(); values.put("todo", dat); db.insert(TABLE_NAME, null, values); } } else { Log.d(Constants.DEBUG_TAG,"db null"); } } }
data.txtãã¡ã€ã«ã¯æ¬¡ã®ãããªã¢ã»ããã«ãããŸãã
ã¶ã¡ãã«ïŒ1
ã¶ã¡ãã«ïŒ2
ã¶ã¡ãã«ïŒ3
ã¶ã¡ãã«ïŒ4
ãããŠãã¢ããªã±ãŒã·ã§ã³ã¯ã©ã¹ïŒ
public class TODOApplication extends Application { private DBHelper mDbHelper; @Override public void onCreate(){ super.onCreate(); mDbHelper = new DBHelper(getApplicationContext()); mDbHelper.getWritableDatabase(); } @Override public void onLowMemory() { super.onLowMemory(); mDbHelper.close(); } @Override public void onTerminate(){ super.onTerminate(); mDbHelper.close(); } }
ãã®ã¯ã©ã¹ã¯ãgetReadableDatabaseïŒïŒ/ getWritableDatabaseïŒïŒã¡ãœãããåŒã³åºãããããŒã¿ããŒã¹ãäœæããããšãã«äœãèµ·ããããå®èšŒããã³æ€èšŒããããã«ã®ã¿äœ¿çšãããããšã«æ³šæããŠãã ããã å®éã®ãããžã§ã¯ãã§ã¯ãã³ãŒãã調æŽããå¿
èŠããããŸãã
ããã«ãandroid_metadataãã¬ãŒããããŒã¿ããŒã¹ã«ïŒç§ã®åå ãªãã§ïŒè¡šç€ºããããããäžèšã®ãšã©ãŒã¯è§£æ±ºãããŸããã
誰ãã圹ã«ç«ã€ãšãããªã
奜å¥å¿ã匷ã
è¿œå 1 ïŒKalobok
habrayuzerããïŒ
ãããŸã§ã®ãšãããSQLiteOpenHelperãå®å
šã«æŸæ£ããŸãããSDã«ãŒãã«ããŒã¿ããŒã¹ãäœæããããšã¯äžå¯èœã§ããããšãå€æããŸããã çè«çã«ã¯ããããè¿ããã®ãããŒã¿ããŒã¹ãžã®ãã¹ãšããŠäœ¿çšããå¿
èŠããããŸãã å®éã«ã¯ãSQLiteOpenHelperã¯ããã䜿çšãããããã€ãã¹ãããããããšããããŸã-ããŒã¿ããŒã¹ãèªã¿åããŸãã¯æžã蟌ã¿çšã«éããã©ãããæ¢ã«ååšãããã©ãããªã©ã«ãã£ãŠç°ãªããŸãã SQLiteOpenHelper.getWritableDatabaseã¯Context.openOrCreateDatabaseãåŒã³åºããContext.openOrCreateDatabaseã¯Context.validateFilePathã䜿çšããŠãã¡ã€ã«ãžã®ãã«ãã¹ãååŸããŸãã ããã§ãåå®çŸ©ã§ããªããã©ã€ããŒãã¡ãœããContext.getDatabasesDirã䜿çšããŸã-å°çããŸããã ããŒã¹ã¯æšæºãã£ã¬ã¯ããªã«äœæãããŸãã
ããããSQLiteOpenHelper.getReadableDatabaseãåŒã³åºããå Žåãæåã«åãgetWritableDatabaseãåŒã³åºãããšããŸãã ãããããããããŸããããªãå ŽåãContext.openOrCreateDatabaseããã€ãã¹ããŸã-Context.getDatabasePathèªäœãåŒã³åºãïŒããã§ä¿®æ£ã§ããŸãïŒãå¿
èŠãªããŒã¿ããŒã¹ãéããŸãã ãã®æ¹æ³ã¯ãåžžã«äœ¿çšãããŠããå Žåã«é©ããŠããŸãã ããããæ²ããããªã :(
äžè¬çã«ããã®ãã«ããŒã®ã¢ã€ãã¢ã¯è¯ãã£ãã§ããå®è£
ã¯-äºæ¥é
ãã®å·Šè¶³ã§ã