Установка приложения для Android без базы данных SQLite - PullRequest
0 голосов
/ 10 ноября 2011

У меня проблема с SQLite. Я разрабатывал со своими подключенными устройствами, а не с эмулятором. Это всегда было хорошо. Я много раз собирал и устанавливал приложение на своем телефоне и планшете. Примерно неделю назад я внес изменения в базу данных SQLite, которая находится в моей папке ресурсов. Я удалил приложение со своих устройств, потому что хотел чистую установку, но теперь кажется, что база данных никогда не попадает туда. это тот же код, который всегда был там. Такие вещи:

ПОЖАЛУЙСТА, ВИДИТЕ Дно для нового образца кода

private static String _DB_PATH = "/data/data/com.android.myapp/databases/";
private static final String _DATABASE_NAME = "myapp.sqlite";

private boolean checkDataBase() {
    SQLiteDatabase checkDB = null;
    try {
        String myPath = _DB_PATH + _DATABASE_NAME;


        ***//THE PROBLEM IS THIS LINE, FOR WHATEVER REASON IT'S NO LONGER FINDING THE DATABASE IN THE ASSETS FOLDER
        checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);***


    } 
    catch (SQLiteException e) {
        //database does't exist yet.
    }
    if (checkDB != null) checkDB.close();

    return checkDB != null ? true : false;
}

public void createDataBase() throws IOException {
    boolean dbExist = checkDataBase();
    if (dbExist) {
        //do nothing - 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.
        try {
            getReadableDatabase();
            copyDataBase();
        } 
        catch (IOException e) {
            throw new Error("Error copying database");
        }
    }
}

Он устанавливается без ошибок, но когда я что-то делаю для доступа к БД на устройстве, он бомбит функцию getReadableDatabase ();.

Вот LogCat:

FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.myapp/com.android.myapp.ActivityL}:                 
java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1748)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764)
at android.app.ActivityThread.access$1500(ActivityThread.java:122)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4025)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
at dalvik.system.NativeStart.main(Native Method)
11-09 21:55:26.250: E/AndroidRuntime(11474): Caused by: java.lang.NullPointerException
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149)
at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:223)
at com.yesjapan.android.database.DatabaseHelper.createDataBase(DatabaseHelper.java:82)
at com.yesjapan.android.database.DbAdapter.open(DbAdapter.java:71)
at com.android.myapp.FragmentP.LoadC(FragmentP.java:226)
at com.android.myapp.FragmentP.onCreateView(FragmentP.java:97)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:735)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:926)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:909)
at android.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1584)
at android.app.Activity.performStart(Activity.java:4377)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1721)

Я могу установить предыдущую версию, и она работает. Я удалил и перестроил с нуля БД. Я понятия не имею, почему он не думает, что база данных там или почему база данных не устанавливается.

Это так неприятно тратить время на это дерьмо, когда есть код, который нужно написать !! Arrgh!

EDIT: Вот еще одна распространенная ошибка

11-10 17:33:55.983: E/Database(22087): sqlite3_open_v2("/data/data/com.android.myapp/databases/myapp.sqlite", &handle, 2, NULL) failed

РЕДАКТИРОВАТЬ: НОВЫЙ ОБРАЗЕЦ КОДА

private boolean checkDataBase() {
    //SQLiteDatabase checkDB = null;
    File dbfile = null;
    try {
        //String myPath = _DB_PATH + _DATABASE_NAME;
        //File myPath = _helperContext.getDatabasePath(_DATABASE_NAME);
        //checkDB = SQLiteDatabase.openDatabase(myPath.toString(), null, SQLiteDatabase.OPEN_READWRITE);

        String myPath = _DB_PATH + _DATABASE_NAME;
        dbfile = new File(myPath);
        //checkdb = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READWRITE);
    } catch (SQLiteException e) {
        Log.e("DatabaseHelper", e.getMessage());
    }
    //if (checkDB != null) checkDB.close();

    return dbfile.exists();         
    //return checkDB != null;
}

public void createDataBase() throws IOException {
    boolean dbExist = checkDataBase();
    if (dbExist) {
        //do nothing - 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.
        getReadableDatabase();
        try {
            copyDataBase();
        } 
        catch (IOException e) {
            throw new Error("Error copying database");
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 10 ноября 2011

Прежде всего, никогда не кодируйте путь жестко, поскольку разные OEM-производители могут изменить любое время, сделав ваше приложение непригодным для использования, вместо этого используйте getDatabasePath ()

0 голосов
/ 10 ноября 2011

Привет Пожалуйста, рецидив ниже линии.в вашем коде

checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);

Вместо

checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

Спасибо

0 голосов
/ 10 ноября 2011

Запустите unzip -l <your_app.apk> и убедитесь, что БД включена.Если его там нет, попробуйте выполнить чистую сборку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...