http://y-anz-m.blogspot.jp/2011/01/android-sqline-database.html
こちらの方のコードを元にassetsに格納したDBからデータを呼び出す方法を用いたのですが、一覧表示を行おうとすると強制終了してしまいました。
logcatを確認してみると
「Caused by: android.database.sqlite.SQLiteException: no such table: Item (code 1): , while compiling: SELECT * FROM Item」
といったログがあったため、正常にDBが読み込まれていないのかなと思いました。
恐らくDBのコピーが正常に行われていないと思い確認してみたのですがいまいちどこが原因なのかがわかりませんでした。
是非ご教授ください。
java
1public class MyOpenHelper extends SQLiteOpenHelper { 2 private static String DB_NAME = "LocationDB.db"; 3 private static String DB_NAME_ASSET = "LocationDB.db"; 4 private static final int DATABASE_VERSION = 17; 5 6 private SQLiteDatabase mDatabase; 7 private final Context mContext; 8 private final File mDatabasePath; 9 10 public MyOpenHelper(Context context) { 11 super(context, DB_NAME, null, DATABASE_VERSION); 12 mContext = context; 13 mDatabasePath = mContext.getDatabasePath(DB_NAME); 14 } 15 16 /** 17 * asset に格納したデータベースをコピーするための空のデータベースを作成する 18 */ 19 public void createEmptyDataBase() throws IOException { 20 boolean dbExist = checkDataBaseExists(); 21 if (dbExist) { 22 // すでにデータベースは作成されている 23 } else { 24 // 空のデータベースをデフォルトシステムパスに作成 25 SQLiteDatabase db_Read = this.getReadableDatabase(); 26 db_Read.close(); 27 28 try { 29 // asset に格納したデータベースをコピーする 30 copyDataBaseFromAsset(); 31 32 String dbPath = mDatabasePath.getAbsolutePath(); 33 SQLiteDatabase checkDb = null; 34 try { 35 checkDb = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE); 36 } catch (SQLiteException e) { 37 } 38 39 if (checkDb != null) { 40 checkDb.setVersion(DATABASE_VERSION); 41 checkDb.close(); 42 } 43 44 } catch (IOException e) { 45 throw new Error("Error copying database"); 46 } 47 } 48 } 49 50 /** 51 * 再コピーを防止するために、すでにデータベースがあるかどうか判定する 52 * 53 * @return 存在している場合 {@code true} 54 */ 55 private boolean checkDataBaseExists() { 56 String dbPath = mDatabasePath.getAbsolutePath(); 57 58 SQLiteDatabase checkDb = null; 59 try { 60 checkDb = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READONLY); 61 } catch (SQLiteException e) { 62 // データベースはまだ存在していない 63 } 64 65 if (checkDb == null) { 66 // データベースはまだ存在していない 67 return false; 68 } 69 70 int oldVersion = checkDb.getVersion(); 71 int newVersion = DATABASE_VERSION; 72 73 if (oldVersion == newVersion) { 74 // データベースは存在していて最新 75 checkDb.close(); 76 return true; 77 } 78 79 // データベースが存在していて最新ではないので削除 80 File f = new File(dbPath); 81 f.delete(); 82 return false; 83 } 84 85 /** 86 * asset に格納したデーだベースをデフォルトのデータベースパスに作成したからのデータベースにコピーする 87 */ 88 private void copyDataBaseFromAsset() throws IOException{ 89 90 // asset 内のデータベースファイルにアクセス 91 InputStream mInput = mContext.getAssets().open(DB_NAME_ASSET); 92 93 // デフォルトのデータベースパスに作成した空のDB 94 OutputStream mOutput = new FileOutputStream(mDatabasePath); 95 96 // コピー 97 byte[] buffer = new byte[1024]; 98 int size; 99 while ((size = mInput.read(buffer)) > 0) { 100 mOutput.write(buffer, 0, size); 101 } 102 103 // Close the streams 104 mOutput.flush(); 105 mOutput.close(); 106 mInput.close(); 107 } 108 109 public SQLiteDatabase openDataBase() throws SQLException { 110 return getReadableDatabase(); 111 } 112 113 @Override 114 public void onCreate(SQLiteDatabase db) { 115 } 116 117 @Override 118 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 119 } 120 121 @Override 122 public synchronized void close() { 123 if(mDatabase != null) 124 mDatabase.close(); 125 126 super.close(); 127 } 128}
Java
1public class sdb extends Activity { 2 protected SQLiteDatabase db; 3 protected Cursor cursor; 4 protected ListAdapter adapter; 5 protected ListView cigaretteList; 6 @Override 7 public void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.showdatabase); 10 db = (new MyOpenHelper(this)).getWritableDatabase(); 11 cigaretteList = (ListView)findViewById(R.id.lvkiso); 12 Cursor c = db.query("Item",null, null, null, null, null, null); 13 c.moveToFirst(); 14 cigaretteList.setAdapter(new SimpleCursorAdapter(this, 15 R.layout.list_item, 16 c, 17 new String[] {"ID", "Name", "Temp"}, 18 new int[] {R.id.ID, R.id.Name, R.id.Temp})); 19 } 20}
確認したこと
assets内のDBの中身の確認
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/24 16:54
2017/01/24 17:07
2017/01/24 20:17
2017/01/25 00:59
2017/01/25 01:47
2017/01/25 01:51
2017/01/26 07:04
2017/01/26 07:09
2017/01/26 11:41
2017/01/26 12:33
2017/01/26 12:55
2017/01/26 13:34
2017/01/26 14:24
2017/01/26 16:45
2017/01/26 17:27
2017/01/27 01:42
2017/01/27 04:18
2017/01/27 05:30
2017/01/27 06:14
2017/01/27 06:33 編集
2017/01/27 07:39
2017/01/27 08:01
2017/01/27 08:04
2017/01/27 08:16
2017/01/27 08:22
2017/01/27 08:49
2017/01/27 09:24
2017/01/28 03:50
2017/01/28 04:39
2017/01/28 11:42