【问题标题】:Application database related activity works in emulator but not working in device应用程序数据库相关活动在模拟器中有效,但在设备中无效
【发布时间】:2012-12-03 15:23:58
【问题描述】:

我使用 Android (api 15) 创建了一个 android 应用程序,并且 android:minSdkVersion 为“8”。我正在使用 4.1 模拟器来运行这个应用程序。它在模拟器中运行良好,并成功安装在具有 api 4.1 的设备中......但是当使用我的 datak 类(数据库连接文件)的活动开始时,应用程序停止工作。

该应用程序是一个测验,其中有一个问题和四个可能的答案。数据库名称是“KBC”,当我推送游戏时会检索到……但在设备上没有检索到数据库。我认为设备找不到我的数据库文件“KBC”位置,其中包含我在模拟器中推送的所有表格和问题......

在虚拟设备文件资源管理器中,它会在“data/data/android.kt.banoge.karodpati/databases”位置显示数据库 kbc

我的datak 课程的代码包含在下面。我已经查看了许多其他问题,但它们没有帮助:

谁能给我这个问题的原因或解决方案?

public class Datak 
{
public static final String QUE = "question";
public static final String A = "optionA";
public static final String B = "optionB";
public static final String C = "optionC";
public static final String D = "optionD";
public static final String ANS = "answer";
public static final String LEV = "level";

private static final String TAG = "DBAdapter";

public static final String played = "played";
public static final String five = "five";
public static final String one = "one";
public static final String second = "second";
public static final String first = "first";


private static final String DATABASE_NAME = "KBC";
private static final String DATABASE_TABLE = "main";
private static final String DATABASE_TABLE2 = "main2";
private static final String DATABASE_TABLE3 = "main3";
private static final int DATABASE_VERSION = 1;

private static final String DATABASE_CREATE =
    "create table "+ DATABASE_TABLE +"("
    + QUE + " text not null,"
    + A + " text not null, " 
    + B + " text not null,"
    + C + " text not null,"
    + D + " text not null," 
    + ANS + " text not null,"
    + LEV + " text not null); ";

private final Context context; 

private DatabaseHelper DBHelper;

private SQLiteDatabase db;

public Datak(Context ctx) 
{
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
}

private static class DatabaseHelper extends SQLiteOpenHelper 
{
    DatabaseHelper(Context context) 
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) 
    {
        db.execSQL(DATABASE_CREATE);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, 
    int newVersion) 
    {
        Log.w(TAG, "Upgrading database from version " + oldVersion 
                + " to "
                + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS titles");
        onCreate(db);
    }
}    

public Datak open() throws SQLException 
{
    db = DBHelper.getWritableDatabase();
    return this;
}


public void close() 
{
    DBHelper.close();
}

public Cursor getValue()
{
     return db.query(DATABASE_TABLE, new String[] {
            QUE, 
            A,
            B,
            C,
            D,
            ANS,LEV
            },
            null,
            null,
            null,
            null,
            null,null
             );


}
public Cursor getValue2()
{
     return db.query(DATABASE_TABLE2, new String[] {
            QUE, 
            A,
            B,
            C,
            D,
            ANS,LEV
            },
            null,
            null,
            null,
            null,
            null,null
             );


}
public Cursor getValue3()
{
     return db.query(DATABASE_TABLE3, new String[] {
            QUE, 
            A,
            B,
            C,
            D,
            ANS,LEV
            },
            null,
            null,
            null,
            null,
            null,null
             );


}
public Cursor getState()
{
     return db.query("states", new String[] {
                played, 
                five,
                one,
                second,
                first
                },
                null,null,null,null,null);


}

public void updateRow(int a) 
{
    final Cursor c1;
    int pl;
 ContentValues CV=new ContentValues();
 c1=db.query("states", new String[] {
        played, 
        five,
        one,
        second,
        first
        },
        null,null,null,null,null);
    c1.moveToPosition(0);

    if(a==1)
    {
        pl=c1.getInt(0);
        pl++;
        CV.put(played, pl); 
    }
    if(a==2)
    {
        pl=c1.getInt(1);
        pl++;
        CV.put(five, pl);
    }
    if(a==3)
    {
        pl=c1.getInt(2);
        pl++;
        CV.put(one, pl);    
    }
    if(a==4)
    {
        pl=c1.getInt(3);
        pl++;
        CV.put(second, pl); 
    }
    if(a==5)
    {
        pl=c1.getInt(4);
        pl++;
        CV.put(first, pl);  
    }

    db.update("states", CV, null, null);
    c1.close();

}

12-05 19:08:57.158:E/AndroidRuntime(13825):致命异常:主要 12-05 19:08:57.158: E/AndroidRuntime(13825): java.lang.IllegalStateException: 无法执行活动的方法 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 android.view.View$1.onClick(View.java:3069) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 android.view.View.performClick(View.java:3591) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 android.view.View$PerformClick.run(View.java:14263) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 android.os.Handler.handleCallback(Handler.java:605) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 android.os.Handler.dispatchMessage(Handler.java:92) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 android.os.Looper.loop(Looper.java:137) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 android.app.ActivityThread.main(ActivityThread.java:4507) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 java.lang.reflect.Method.invokeNative(Native Method) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 java.lang.reflect.Method.invoke(Method.java:511) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 12-05 19:08:57.158: E/AndroidRuntime(13825): at dalvik.system.NativeStart.main(Native Method) 12-05 19:08:57.158:E/AndroidRuntime(13825):原因:java.lang.reflect.InvocationTargetException 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 java.lang.reflect.Method.invokeNative(Native Method) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 java.lang.reflect.Method.invoke(Method.java:511) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 android.view.View$1.onClick(View.java:3064) 12-05 19:08:57.158: E/AndroidRuntime(13825): ... 11 更多 12-05 19:08:57.158: E/AndroidRuntime(13825): Caused by: android.database.sqlite.SQLiteException: no such table: states: , while compile: SELECT play, 五, 一, 二, 第一个 FROM 状态 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 android.database.sqlite.SQLiteCompiledSql.(SQLiteCompiledSql.java:68) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:127) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:94) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 android.database.sqlite.SQLiteQuery.(SQLiteQuery.java:53) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1690) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1575) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1531) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1611) 12-05 19:08:57.158: E/AndroidRuntime(13825): at com.kt.banoge.karodpati.Datak.updateRow(Datak.java:172) 12-05 19:08:57.158: E/AndroidRuntime(13825): 在 com.kt.banoge.karodpati.MainActivity.change(MainActivity.java:66) 12-05 19:08:57.158: E/AndroidRuntime(13825): ... 14 更多 }

【问题讨论】:

    标签: android sqlite database-connection


    【解决方案1】:

    你能不能替换 db.execSQL("DROP TABLE IF EXISTS title"); by db.execSQL("如果存在则删除表" + DATABASE_TABLE);

    这可能会有所帮助;)

    谢尔盖

    【讨论】:

    • 我试过这个解决方案应用程序可以在模拟器上正常工作,但仍然不能在设备上工作......如果我升级数据库,你的解决方案 db.execsql 只涉及......不是为了打开数据库!!!
    • 是的,但是如果您看一下:您尝试在创建表“main”时删除表“title”:副作用可能是主表的结构未升级-迄今为止。
    • 当你写“应用程序停止工作”时,你是否通过logcat收到异常?如果您在设备上调试应用程序会怎样?
    • 顺便说一句,我在 kbc.db 中有 4 个表,我已经通过 sqlite 管理器手动插入...我应该通过查询来创建这些表吗??
    • 我在设备上调试应用程序。以下是我的设备显示“应用程序停止工作”时的异常日志。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多