2015-05-02 3 views
-1

У меня есть одна база данных sqlite, хранящаяся в папке «assets», и я хотел бы сохранить ее в папке данных/данных на устройстве Android. Это всего лишь readonly db, из которого я хочу получить данные.SQLite Хранилище базы данных в/data/data Android

Я читал много тем, говорящих об этом, но когда я проверяю папку/data/data/на своем устройстве, моего пакета нет. Вот код, который я использую:

public class DatabaseManager extends SQLiteOpenHelper { 
private static final String TAG = "DataBaseManager"; 

private static String DB_PATH = "/data/data/com.my_package/databases/"; 
private static String DB_NAME = "my_database"; 
public SQLiteDatabase myDataBase; 
private final Context myContext; 

/** 
* Constructor 
* Takes and keeps a reference of the passed context in order to access to the application assets and resources. 
* @param context 
*/ 
public DatabaseManager(Context context) { 

    super(context, DB_NAME, null, 1); 
    this.myContext = context; 
    try { 
     createDataBase(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

/** 
* Creates a empty database on the system and rewrites it with your own database. 
* */ 
public void createDataBase() throws IOException{ 

    boolean dbExist = checkDataBase(); 

    if(dbExist){ 
     //do nothing - database already exist 
     Log.d("DATABASE", "ALREADY EXIST"); 
    }else{ 

     //By calling this method and empty database will be created into the default system path 
     //of your application so we are gonna be able to overwrite that database with our database. 
     this.getWritableDatabase(); 

     try { 
      copyDataBase(); 
     } catch (IOException e) { 
      throw new Error("Error copying database"); 
     } 
    } 
} 

/** 
* Check if the database already exist to avoid re-copying the file each time you open the application. 
* @return true if it exists, false if it doesn't 
*/ 
private boolean checkDataBase(){ 
    SQLiteDatabase checkDB = null; 

    try{ 
     String myPath = DB_PATH + DB_NAME; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
    }catch(SQLiteException e){ 
     Log.d("DATABASE", "DOESNT EXIST"); 
    } 

    if(checkDB != null){ 

     checkDB.close(); 

    } 

    return checkDB != null ? true : false; 
} 

/** 
* Copies your database from your local assets-folder to the just created empty database in the 
* system folder, from where it can be accessed and handled. 
* This is done by transfering bytestream. 
* */ 
private void copyDataBase() throws IOException { 
    //Open your local db as the input stream 
    InputStream myInput = myContext.getAssets().open(DB_NAME); 

    // Path to the just created empty db 
    String outFileName = DB_PATH + DB_NAME; 


    //Open the empty db as the output stream 
    OutputStream myOutput = new FileOutputStream(outFileName); 


    //transfer bytes from the inputfile to the outputfile 
    byte[] buffer = new byte[2048]; 
    int length; 
    while ((length = myInput.read(buffer))>0){ 
     myOutput.write(buffer, 0, length); 
    } 

    //Close the streams 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 
    Log.d("COPY DATABASE", "DATABASE COPIED"); 
} 

public void openDataBase() throws SQLException { 
    //Open the database 
    String myPath = DB_PATH + DB_NAME; 
    myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
    Cursor cursor = myDataBase.rawQuery("SELECT * FROM chapters", null); 

    while (cursor.moveToNext()) { 
     cursor.getString(3); 
     Log.d("CONTENT", cursor.getString(3)); 
    } 

    myDataBase.beginTransaction(); 
} 

@Override 
public synchronized void close() { 

    if(myDataBase != null) 
     myDataBase.close(); 

    super.close(); 

} 

@Override 
public void onCreate(SQLiteDatabase db) { 

} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

} 

Благодаря Log.d() сообщения, я могу увидеть следующее сообщение: «база данных уже существует» (сообщение от метода CreateDatabase) и тем не менее, у меня нет данных в папке/data/data моего устройства Android.

Это кажется странным для меня, потому что в методе checkDatabase я проверяю, существует ли база данных в переменной myPath, переменная, значение которой соответствует DB_PATH и DB_NAME, а именно папка/data/data, и, как я уже сказал, я открыл внутреннюю память моего устройства и проверили, было ли что-то создано в папке/data/data, но ничего.

ответ

0

Я думаю, что вы ВГА изменить переменную DB_NAME от «my_database» до «my_database.sqlite»

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

проверить эту ссылку ... check database if exist in android studio

+0

Действительно, это то, что я сделал. Я использовал флаг CREATE_IF_NECESSARY и добавил расширение .sqlite. Теперь я могу даже получить данные из этой базы данных. Но у меня все еще есть вопрос, хочу ли я создать свою папку не в/data/data, а в той же папке, где находится папка «data» или «Download» (некоторые приложения создают там свою папку). Как я могу это сделать? Просто изменив db_path на «/ my_package_name» (похоже, не работает, у меня ошибка при попытке)? Спасибо за сообщение! – Seuseukeu

+0

Это то, что я говорю человеку ... в вашем текущем коде, база данных хранится в системной папке Android, которая недоступна обычным пользователям ... вы можете запустить ваше устройство и использовать проводник файла liek root explorer для просмотра файлов ... и если вы хотите сохранить свою базу данных во внутренней памяти или на карте памяти, сделайте это в контексте вспомогательной базы данных ... DatabaseHelper (контекст контекста) { super (context, context.getExternalFilesDir (null).getAbsolutePath() + "/" + DATABASE_NAME, null, DATABASE_VERSION); } –

+0

Спасибо, я получил его сейчас;) Проблема решена тогда! – Seuseukeu

1

Лучше проверить DB File как

public boolean checkDataBase(){ 
    File databaseFile = new File(DB_PATH + DB_NAME); 
    return databaseFile.exists();   
} 
+0

Я пробовал этот код и ничего не менял. Он действует так же, как DB уже существует в этой папке, но, как ни странно, я этого не вижу. Я также пытаюсь изменить db_path ("/data/data/com.my_package"), все еще с этим кодом, и теперь он вызывает метод copyDatabase, но код выдает сообщение об ошибке «копирование базы данных ошибок». – Seuseukeu

0

SQLiteDatabase.openDatabase будет автоматически создавать БД, если она не существует (см CREATE_IF_NECESSARY флаг).

В общем случае вы должны сначала скопировать встроенную базу данных из каталога ресурсов в каталог данных приложений: data/data/com.my_package/databases.

Тогда вы можете использовать базу данных.

См SQLiteAssetHelper при необходимости: https://github.com/jgilfelt/android-sqlite-asset-helper

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