2015-12-03 2 views
6

У меня возникли сбои на некоторых устройствах при использовании SQLiteAssetHelper в моем приложении, прежде всего на устройствах OnePlus. Теперь я прочитал here, что он связан с каталогом, в котором хранится база данных.SQLiteAssetHelper - проблемы с конкретными телефонами, например. OnePlus

Сейчас я пытаюсь найти обходной путь, лучший, что я мог придумать в настоящее время является конструктором, как этого

public MySubclass(Context context) { 
    super(context, databaseName, context.getFilesDir() + "/databases", null, databaseVersion); 

Является ли это правильный способ сделать это, или есть другие проблемы, связанные с этим подходом ?

EDIT

Исключение составляет

Fatal Exception: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version x to y: /data/data/my.package.id/databases/database.db 

К сожалению, я связан неправильный SO-вопрос: this is the correct one. Там говорится: «OnePlus способен копировать базу данных в /data/data/package-name/databases/filename.db, но она не позволяет получить доступ к этим данным, и я не имею в виду этого».

+0

Эй вы хотите скопировать базу данных из одного места в другое место? –

+0

http://stackoverflow.com/a/34260857/3513479 –

+0

Какая конкретная модель (ы) дает вам эту проблему? Я могу попытаться взять его в руки, чтобы воспроизвести проблему. – CommonsWare

ответ

2

Конструктор SQLiteAssetHelper позволяет указать свой собственный путь назначения базы данных (папка должна быть доступна для записи). Если вы не укажете, что он по умолчанию использует один. Смотрите этот отрывок из репо Github:

if (storageDirectory != null) { 
     mDatabasePath = storageDirectory; 
    } else { 
     mDatabasePath = context.getApplicationInfo().dataDir + "/databases"; 
    } 
+0

Да, я знаю, поэтому я использую конструктор, который вы видите в моем вопросе. Я просто не уверен, правильно ли это, особенно в той директории, которую я использую. – swalkner

+0

Могу я спросить вас об исключении, которое вы получаете при использовании «context.getApplicationInfo(). DataDir»? Я не пробовал себя с getFilesDir, поэтому я размышляю здесь. Возможно, ваше приложение перестает работать, если вы переместите его на SD-карту, например. – narko

+0

см. Мое редактирование – swalkner

2
Hey you can copy database from one to another from below mentioned code. 

public class MySQLiteHelper extends SQLiteOpenHelper implements DBConstants { 

private static MySQLiteHelper mInstance = null; 
private SQLiteDatabase myDataBase; 
private static String DB_PATH = ""; 

public MySQLiteHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    try { 
     if (checkDataBase()) 
      openDataBase(); 
     else 
      myDataBase = this.getReadableDatabase(); 
    } catch (Exception e) { 
    } 
} 

public static MySQLiteHelper instance(Context context) { 

    File outFile = context.getDatabasePath(DATABASE_NAME); 
    DB_PATH = outFile.getPath(); 

    if (mInstance == null) { 
     mInstance = new MySQLiteHelper(context); 
    } 

    return mInstance; 
} 
+0

Если вы хотите скопировать вставку, то другие ответят хотя бы сделать это полностью и дать оригинальный пользовательский кредит: - | P.S: Оригинальный ответ [ссылка] (http://stackoverflow.com/a/34260857/3125800) – Build3r

Смежные вопросы