造成原因:android.database.sqlite.SQLiteException:否这样的表:BOOK(代码1 SQLITE_ERROR)

Avi*_*Avi 5 android android-sqlite android-9.0-pie

我们已经创建了xyz.sqlite文件(在其中我们有名为BOOK的表),并将其保存到“ raw”文件夹中,然后在运行时复制该文件并创建数据库,在所有版本的android至Android8。但是,当我在模拟器上的Android 9(Pie)上运行它时,它给了我下面提到的错误...

搜索了解决方案,但是没有任何效果。任何帮助将不胜感激。

谢谢。

09-13 00:55:49.536 5685-5685/? E/AndroidRuntime: FATAL EXCEPTION: main
                                             Process: com.kosmos.zentrale, PID: 5685
                                             java.lang.RuntimeException: Unable to start activity ComponentInfo{com.kosmos.zentrale/com.kosmos.zentrale.CatalogNew}: android.database.sqlite.SQLiteException: no such table: BOOK (code 1 SQLITE_ERROR): , while compiling: SELECT * FROM BOOK ORDER BY _erscheinungsjahr DESC  , _uniqueID ASC
                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
                                                 at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
                                                 at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
                                                 at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
                                                 at android.os.Handler.dispatchMessage(Handler.java:106)
                                                 at android.os.Looper.loop(Looper.java:193)
                                                 at android.app.ActivityThread.main(ActivityThread.java:6669)
                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
                                              Caused by: android.database.sqlite.SQLiteException: no such table: BOOK (code 1 SQLITE_ERROR): , while compiling: SELECT * FROM BOOK ORDER BY _erscheinungsjahr DESC  , _uniqueID ASC
                                                 at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                                                 at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:903)
                                                 at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:514)
                                                 at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
                                                 at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
                                                 at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
                                                 at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46)
                                                 at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1408)
                                                 at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1255)
                                                 at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1126)
                                                 at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1294)
                                                 at com.mobisys.android.database.BookDatabase.query(BookDatabase.java:68)
                                                 at com.mobisys.android.database.HelperDatabase.getBooks(HelperDatabase.java:57)
                                                 at com.kosmos.zentrale.CatalogNew.setCursorAdapter(CatalogNew.java:617)
                                                 at com.kosmos.zentrale.CatalogNew.onCreate(CatalogNew.java:120)
                                                 at android.app.Activity.performCreate(Activity.java:7136)
                                                 at android.app.Activity.performCreate(Activity.java:7127)
                                                 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) 
                                                 at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
                                                 at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
                                                 at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) 
                                                 at android.os.Handler.dispatchMessage(Handler.java:106) 
                                                 at android.os.Looper.loop(Looper.java:193) 
                                                 at android.app.ActivityThread.main(ActivityThread.java:6669) 
                                                 at java.lang.reflect.Method.invoke(Native Method) 
                                                 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 
Run Code Online (Sandbox Code Playgroud)

下面是我们的数据库创建代码

public class BookDatabase {
public static final String DATABASE_NAME = "xyz.sqlite";
public static final int DATABASE_VERSION = 2;
private static String DB_PATH = "/data/data/"+"/databases/";
private OpenHelper gameHelper;
private SQLiteDatabase database;

public BookDatabase(Context context){
    try {
        DB_PATH = "/data/data/"+context.getPackageName()+"/databases/";
        gameHelper=new OpenHelper(context);
        gameHelper.createDataBase();
        openDataBase();
    } catch (IOException e) {
        gameHelper=null;
        e.printStackTrace();
    }
    catch (SQLException e) {
        gameHelper=null;
        e.printStackTrace();
    }
}

public void openDataBase() throws SQLException{
    //Open the database
    String myPath = DB_PATH + DATABASE_NAME;
    database = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
}


public long insert(String table, ContentValues values){
    return database.insert(table, null, values);
}

public long delete(String table, String where, String[] whereArgs){
    return database.delete(table, where, whereArgs);
}

public int update(String table, ContentValues values, String whereClause, String[] whereArgs){
    return database.update(table, values, whereClause, whereArgs);
}

public long countRows(String query){
    return DatabaseUtils.longForQuery(database, query, null);
}

public Cursor query(String table,String[] columns, String selection,String[] selectionArgs,String groupBy,String having,String orderBy){
    return database.query(table, columns, selection, selectionArgs, groupBy, having, orderBy);
}

public void close(){
    database.close();
    gameHelper.close();
}

public Cursor rawQuery(String sql,String[] args){
    return database.rawQuery(sql, args);
}

private class OpenHelper extends SQLiteOpenHelper {
    Context context;

    OpenHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.context=context;
    }

    /**
     * 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
        }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.getReadableDatabase();

            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(){

        try{
            File databasePath = context.getDatabasePath(DATABASE_NAME);
            return databasePath.exists();
        }catch(Exception e){
            return 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 = context.getResources().openRawResource(R.raw.xyz);

        // Path to the just created empty db
        String outFileName = DB_PATH + DATABASE_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[1024];
        int length;
        while ((length = myInput.read(buffer))>0){
            myOutput.write(buffer, 0, length);
        }

        //Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();

    }

    @Override
    public void onCreate(SQLiteDatabase arg0) {
    }

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

}
Run Code Online (Sandbox Code Playgroud)

}

小智 6

我在应用程序中执行的操作完全相同,创建一个“ my_db.sql”->将其保存到“ raw”文件夹中,然后将其复制并在运行时创建数据库。

我遇到过同样的问题。该应用程序似乎在Pie之外的所有较低版本的Android上均可正常运行。经过深思熟虑和分析,对我有用的是添加一行代码“ db.disableWriteAheadLogging();”。在“ onOpen()”方法中。

@Override
public void onOpen(SQLiteDatabase db) {
    super.onOpen(db);
    db.disableWriteAheadLogging();
}
Run Code Online (Sandbox Code Playgroud)


小智 1

如果您确定数据库的完整性和代码的正确性,那么最可能的错误原因可能是因为您的资产文件在构建 APK 时被压缩。

要禁用数据库文件的自动压缩,请在 android 块内的应用程序 build.gradle 文件中包含以下代码片段。

aaptOptions {
   noCompress 'db'
}
Run Code Online (Sandbox Code Playgroud)

希望这能解决您的问题...