Конкретная ошибка: Сбой приложения Android с базой данных SQLite при попытке доступа к данным / данным / пакетам / базам данных
Примечание. Мне известно, что в Stackoverflow было опубликовано много статей, а также ряд рекомендуемых сайтов, посвященных тому, как скопировать файл sqlite из папки Assets в папку data / data / package / database. Однако моя реализация работает только на эмуляторе, а не на реальных устройствах. Я думаю, что мне не хватает части головоломки.
Мой вопрос
Кто-нибудь может определить точку отказа в моем коде? Я действительно думаю, что это один из тех вопросов, когда свежая пара глаз быстро найдет ошибку. Заранее благодарим вас за любые идеи, которые вы можете предоставить ...
Журналы ошибок (жирным шрифтом обозначены точки отказа):
11-02 20: 22: 17.045: INFO / Process (15318): отправка сигнала. PID: 15318 SIG: 9
11-02 20: 22: 17.055: INFO / ActivityManager (2697): процесс com.game.myapp (pid 15318) умер.
11-02 20: 22: 17.055: INFO / WindowManager (2697): WIN DEATH: Window {40922a70 com.game.myapp / com.game.myapp.MainActivity приостановлено = true}
Мой код
public class DatabaseHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "ttg.db";
public static String DATABASE_PATH = "/data/data/com.game.myapp/databases/";
private SQLiteDatabase ttgDatabase;
private Context myContext = null;
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.myContext = context;
}
public void createDataBase() throws IOException{
boolean dbExist = checkDataBase();
if(dbExist){
//do nothing
}else{
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
private boolean checkDataBase(){
SQLiteDatabase checkDB = null;
try{
String myPath = DATABASE_PATH + DATABASE_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}catch(SQLiteException e){
}
if(checkDB != null){
checkDB.close();
}
return checkDB != null ? true : false;
}
private void copyDataBase() throws IOException{
File fileTest = myContext.getFileStreamPath(DATABASE_NAME);
boolean exists = fileTest.exists();
if (!exists) {
OutputStream databaseOutputStream = new FileOutputStream(DATABASE_PATH + DATABASE_NAME);
InputStream databaseInputStream;
databaseInputStream = myContext.getAssets().open(DATABASE_NAME);
byte[] buffer = new byte[1024];
int length;
while ((length = databaseInputStream.read(buffer)) > 0) {
databaseOutputStream.write(buffer);
}
// Close the streams
databaseInputStream.close();
databaseOutputStream.flush();
databaseOutputStream.close();
}
}
public void openDataBase() throws SQLException{
//Open the database
String myPath = DATABASE_PATH + DATABASE_NAME;
ttgDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}
@Override
public synchronized void close() {
if(ttgDatabase != null)
ttgDatabase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}