Проблема SQLite - отлично работает в эмуляторе 1.6 - не работает на телефоне (2.2) или эмуляторе 2.0+ - PullRequest
2 голосов
/ 07 августа 2010

Я создал базу данных sqlite для хранения списков воспроизведения для мультимедийного проигрывателя, который я разрабатываю из-за расширенной функции (а не использования Content Provider).Он отлично работает на эмуляторе 1.6, но FC на чем-то выше 2.0 ... что изменилось, о чем мне нужно знать, если открыть базы данных в SDK 2.0+?Вот logcat.

08-06 19: 05: 46.365: INFO / SQLiteDatabaseAdapter (4692): БД (playlists.db) скопирована!08-06 19: 05: 46.373: INFO / SQLiteDatabaseAdapter (4692): попытаться создать экземпляр базы данных (playlists.db) 08-06 19: 05: 46.373: INFO / SQLiteDatabaseAdapter (4692): создать или открыть базу данных: списки воспроизведения.дБ 08-06 19: 05: 46.389: INFO / SQLiteDatabaseAdapter (4692): создан экземпляр базы данных (playlists.db)!08-06 19: 05: 46.389: INFO / База данных (4692): возвращен sqlite: код ошибки = 1, msg = нет такой таблицы: список воспроизведения 08-06 19: 05: 46.397: DEBUG / AndroidRuntime (4692): выключение виртуальной машины08-06 19: 05: 46.397: WARN / dalvikvm (4692): threadid = 1: поток завершается с необработанным исключением (group = 0x4001d7e0) 08-06 19: 05: 46.514: ERROR / AndroidRuntime (4692): FATAL EXCEPTION: main08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): java.lang.RuntimeException: не удается запустить действие ComponentInfo {com.androidworkz.andamp / com.androidworkz.andamp.andAMP}: android.database.sqlite.SQLiteException: нет такой таблицы: список воспроизведения:, при компиляции: SELECT список воспроизведения. * ИЗ списка воспроизведения ORDER BY id ASC;08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2663) 08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): на андроид.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2679) 08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): на android.app.ActivityThread.access $ 2300 (ActivityThread.java:125) 08-06 19:05: 46.514: ОШИБКА / AndroidRuntime (4692): на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:2033) 08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): на android.os.Handler.dispatchMessage (Handler.java:99) 08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): на android.os.Looper.loop (Looper.java:123) 08-06 19: 05: 46.514: ОШИБКА /AndroidRuntime (4692): на android.app.ActivityThread.main (ActivityThread.java:4627) 08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): на java.lang.reflect.Method.invokeNative (собственный метод)08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): в java.lang.reflect.Method.invoke (Method.java:521) 08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:868) 08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692):в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:626) 08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): в dalvik.system.NativeStart.main (собственный метод) 08-0619: 05: 46.514: ОШИБКА / AndroidRuntime (4692): вызвано: android.database.sqlite.SQLiteException: нет такой таблицы: playlist:, при компиляции: SELECT playlist. * ИЗ списка воспроизведения ORDER BY id id ASC;08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): в android.database.sqlite.SQLiteCompiledSql.native_compile (собственный метод) 08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): в android.database.sqlite.SQLiteCompiledSql.compile (SQLiteCompiledSql.java:91) 08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): в android.database.sqlite.SQLiteCompiledSql. (SQLiteCompiledSql.java:64) 08-06 19:05: 46.514: ОШИБКА / AndroidRuntime (4692): в android.database.sqlite.SQLiteProgram. (SQLiteProgram.java:80) 08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): в android.database.sqlite.SQLiteQuery. (SQLiteQuery.java:46) 08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): в android.database.sqlite.SQLiteDirectCursorDriver.query (SQLiteDirectCursorDriver.java:42) 08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): в android.database.sqlite.SQLiteDatabase.rawQueryWithFactory (SQLiteDatabase.java:1345)08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): в android.database.sqlite.SQLiteDatabase.rawQuery (SQLiteDatabase.java:1315) 08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): вcom.androidworkz.andamp.objects.Playlist.getPlaylists (Playlist.java:75) 08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): в com.androidworkz.andamp.andAMP.onCreate (andAMP.java:353) 08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): на android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1047) 08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): на андроид.app.ActivityThread.performLaunchActivity (ActivityThread.java:2627) 08-06 19: 05: 46.514: ОШИБКА / AndroidRuntime (4692): ... еще 11

Вот класс dbhelper

package com.androidworkz.andamp;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {

// Android's default system path for your application's database.
private static String DB_PATH = "/data/data/com.androidworkz.andamp/databases/";

private static String DB_NAME = "playlists.db";

public DBHelper(Context context) {

    super(context, DB_NAME, null, 1);
    if (!checkDataBaseExistence()) {
        createDatabase();
    }
}

public void onCreate(SQLiteDatabase db) {
    // Leave this method empty
}

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // fill in your code here
}

public void createDatabase() {

    SQLiteDatabase db = null;
    String dbPath = DB_PATH + DB_NAME;
    db = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.CREATE_IF_NECESSARY);
    db.close();

    db = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE);

    db.execSQL("CREATE TABLE [playlist] ("+
            "[id] INTEGER  PRIMARY KEY AUTOINCREMENT NOT NULL,"+
            "[name] VARCHAR(255)  NULL);)");

    db.execSQL("CREATE TABLE [songs] ("+
            "[id] INTEGER  PRIMARY KEY AUTOINCREMENT NOT NULL,"+
            "[playlistId] INTEGER  NULL,"+
            "[songId] INTEGER  NULL,"+
            "[name] VARCHAR(255)  NULL,"+
            "[key] VARCHAR(255)  NULL,"+
            "[duration] INTEGER  NULL,"+
            "[path] VARCHAR(255)  NULL,"+
            "[artistName] VARCHAR(255)  NULL,"+
            "[artistKey] VARCHAR(255)  NULL,"+
            "[albumId] INTEGER  NULL,"+
            "[albumName] VARCHAR(255)  NULL,"+
            "[albumKey] VARCHAR(255)  NULL);");
    db.close();
}

private boolean checkDataBaseExistence() {

    // database to be verified
    SQLiteDatabase dbToBeVerified = null;

    try {
        // get database path
        String dbPath = DB_PATH + DB_NAME;
        // try to open the database
        dbToBeVerified = SQLiteDatabase.openDatabase(dbPath, null,
                SQLiteDatabase.OPEN_READONLY);

    } catch (SQLiteException e) {
        // do nothing since the database does not exist
    }

    // in case it exists, close it
    if (dbToBeVerified != null) {
        // close DB
        dbToBeVerified.close();

    }

    // in case there is a DB entity, the DB exists
    return dbToBeVerified != null ? true : false;
}
}

Боже, как же я ненавижу этот глупый "ввод кода здесь" ... почему не может использовать stackoverflow просто использовать теги, как обычный подсветчик синтаксиса.

Ответы [ 2 ]

2 голосов
/ 07 августа 2010

08-06 19: 05: 46.389: INFO / База данных (4692): sqlite вернул: код ошибки = 1, сообщение = нет такой таблицы: список воспроизведения

база данных копируется правильно, похоже, что таблица не существует?

Вы пытались скопировать данные с телефона после выполнения через DDMS и изучить его, чтобы проверить правильность схемы?

0 голосов
/ 10 августа 2010

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

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