引起原因:android.database.sqlite.SQLiteException:否这样的表:BOOK(代码1 SQLITE_ERROR) [英] Caused by: android.database.sqlite.SQLiteException: no such table: BOOK (code 1 SQLITE_ERROR)

查看:71
本文介绍了引起原因:android.database.sqlite.SQLiteException:否这样的表:BOOK(代码1 SQLITE_ERROR)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

We have created the xyz.sqlite file(in which we have table called BOOK) and saved it into "raw" folder and then copying the file and creating the database at run time, which is working fine in all the versions of android up to Android 8. However when I'm running it on Android 9(Pie) on emulator, it's giving me below mentioned error...

搜索了解决方案,但无济于事...任何帮助将不胜感激...

Searched for the solution but nothing worked... Any help would be appreciated...

谢谢.

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) 

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

Below is our database creation code

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

}

}

推荐答案

我在应用程序中所做的完全相同,创建了一个"my_db.sql"->将其保存到"raw"文件夹中,然后复制它并在运行时创建数据库.

What I'm doing in my app is exactly the same thing, creating a "my_db.sql" -> saving it into the "raw" folder and then copying it and creating my DB at runtime.

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

I had the same issue. The app seemed to work fine on all lower versions of Android except the Pie. After much deliberation and analysis, what worked for me is adding one single line "db.disableWriteAheadLogging();" in the "onOpen()" method.

@Override
public void onOpen(SQLiteDatabase db) {
    super.onOpen(db);
    db.disableWriteAheadLogging();
}

这篇关于引起原因:android.database.sqlite.SQLiteException:否这样的表:BOOK(代码1 SQLITE_ERROR)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆