android - 三星设备上的数据库错误

标签 android sqlite samsung-mobile

我在使用三星设备时遇到了麻烦。在我的应用程序中,每次我在市场上上传新版本时,都想替换数据库...但是在尝试保存一些数据之前。该代码可在ADV和许多设备上正常运行,但不能在Samsung Galaxy(S系列,选项卡)等设备上使用。

我已经尝试过将this.getReadableDatabase()转换为this.getWritableDatabase(),但是没有任何变化。

我也检查了类似的帖子Failed to create SQLite DB in my Samsung y duos device in Android?

有人可以帮我吗?下面是基本代码和我的尝试

...
public void createDataBase() throws IOException{     
    boolean dbExist = checkDataBase();
    SQLiteDatabase db = null;
    if(dbExist){

    }else{
        db = this.getReadableDatabase();
        db.close();
        try {
            copyDataBase();
            Log.e(TAG, "createDatabase database created"); 
        } catch (IOException e) {
            throw new Error("Erro ao copiar banco");
        }
    }
}
/*
Both file or a database check works 
 */
private boolean checkDataBase(){

    File checkDB = new File (Bd_path + Bd_name);
    return checkDB.exists();

    /*SQLiteDatabase checkDB = null;
    try {
        String myPath = Bd_path + Bd_name;
        checkDB = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READONLY);
    } catch (SQLiteException e) {
        e.printStackTrace();
    }

    if (checkDB != null) {
        checkDB.close();
    }
    return checkDB != null ? true : false;*/
}
...


第一次尝试-正常工作,但在三星设备上除外

public void createDataBase() throws IOException{     
    boolean dbExist = checkDataBase();
    SQLiteDatabase db = null;
    if(dbExist){
        try {
            openDataBase();
            Cursor resul = bancoDados.rawQuery("Select ativo from configuracao", null);
            resul.moveToFirst();
            if (Integer.valueOf(resul.getString(resul.getColumnIndex("ativo"))) <= 1) {
                copyDataBase();
                Log.v("Data", "updated");
                bancoDados.execSQL("UPDATE configuracao SET ativo = '2'");
            }
            resul.close();
            bancoDados.close();
        }catch (Exception e) {
            e.printStackTrace();
        }
...


第二次尝试-正常工作,但在三星设备上除外

public void createDataBase() throws IOException{     
    boolean dbExist = checkDataBase();
    SQLiteDatabase db = null;
    if(dbExist){
        try {
            db = this.getReadableDatabase();
            Cursor resul = db.rawQuery("Select ativo from configuracao", null);
            resul.moveToFirst();
            if (Integer.valueOf(resul.getString(resul.getColumnIndex("ativo"))) <= 1) {
                copyDataBase();
                Log.v("Data", "updated");
                db.execSQL("UPDATE configuracao SET ativo = '2'");
            }
            resul.close();
            db.close();
        }catch (Exception e) {
            e.printStackTrace();
        }
...


设备尝试读取我的数据库时出现错误提示

android.database.sqlite.SQLiteException: no such table: configuracao: , while compiling: Select ativo from configuracao
at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:110)
at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:71)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1356)
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1324)
at com.ead.louvemosfinal.Dados_banco.createDataBase(Dados_banco.java:47)
at com.ead.louvemosfinal.DataAdapter.createDatabase(DataAdapter.java:31)
at com.ead.louvemosfinal.Inicio.construtor(Inicio.java:116)
at com.ead.louvemosfinal.Inicio.onCreateView(Inicio.java:97)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
at android.support.v4.app.FragmentTabHost.onAttachedToWindow(FragmentTabHost.java:279)
at android.view.View.dispatchAttachedToWindow(View.java:6177)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1266)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1271)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1271)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1271)
at android.view.ViewRoot.performTraversals(ViewRoot.java:771)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1868)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3709)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
at dalvik.system.NativeStart.main(Native Method)


当它读取数据库时,无法在以下类(Inicio.class)上从该表加载数据

Code of Inicio.class
...
bancoDados = new DataAdapter(getActivity());
bancoDados.createDatabase();
bancoDados.open();
settings = bancoDados.carregaConfiguracao()
bancoDados.close();
...


我得到的错误

android.database.sqlite.SQLiteException: no such table: configuracao: , while compiling: SELECT * FROM configuracao
at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92)
at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1357)
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1325)
at com.ead.louvemosfinal.DataAdapter.carregaConfiguracao(DataAdapter.java:429)
at com.ead.louvemosfinal.Inicio.construtor(Inicio.java:118)
at com.ead.louvemosfinal.Inicio.onCreateView(Inicio.java:97)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
at android.support.v4.app.FragmentTabHost.onAttachedToWindow(FragmentTabHost.java:279)
at android.view.View.dispatchAttachedToWindow(View.java:6156)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1122)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1127)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1127)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:1127)
at android.view.ViewRoot.performTraversals(ViewRoot.java:773)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1867)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
at dalvik.system.NativeStart.main(Native Method)


来自DataAdapter的carregaConfiguracao代码

public String[] carregaConfiguracao(){
    Cursor resul = mDb.rawQuery("SELECT * FROM configuracao", null);
    String[] dados = new String[11];
    resul.moveToFirst();
        dados[0] = resul.getString(resul.getColumnIndex("_id"));
        dados[1] = resul.getString(resul.getColumnIndex("fonte"));
        dados[2] = resul.getString(resul.getColumnIndex("nome"));
        dados[3] = resul.getString(resul.getColumnIndex("email"));
        dados[4] = resul.getString(resul.getColumnIndex("cor_nota"));
        dados[5] = resul.getString(resul.getColumnIndex("cor_letra"));
        dados[6] = resul.getString(resul.getColumnIndex("contraste"));
        dados[7] = resul.getString(resul.getColumnIndex("refrao"));
        dados[8] = resul.getString(resul.getColumnIndex("acordes"));
        dados[9] = resul.getString(resul.getColumnIndex("musica"));
        dados[10] = resul.getString(resul.getColumnIndex("cantor"));
        resul.close();
    return dados;

}

最佳答案

使用此DataBaseHandler Calss.it适用于所有android设备。

关于android - 三星设备上的数据库错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21257129/

相关文章:

java - 为Android命名主类

visual-studio-code - 我可以在新的 Samsung Chromebook Pro 上使用 VS Code 进行开发吗?

android - 短信被复制为通话(三星 galaxy S II)

sqlite - SQLITE导入问题

android - 三星设备上的 AcousticEchoCanceler 无法正常工作

android - 由 java.lang.RuntimeException : Missing type parameter 引起

android - 将 android 项目迁移到 Gradle?

android - 单击按钮后出现空指针异常(SQLite 数据库)

android - 如何在 Android 中使用 ContentResolver 进行不区分大小写的查询?

ios - 如何在 Swift 中将 UITableView 的单元格文本设置为数据库单元格的内容?