繁体   English   中英

Android:SQLite数据库“不存在这样的表”

[英]Android: SQLite Database “No such table exists”

到目前为止,Android Development似乎对我来说是种种种纠结错误的祸根,因此我再次提出了一个问题。 我正在通过SQLite创建数据库连接,但出现以下错误:

(1) no such table: TABLE_NAME

我尝试重新安装我的应用程序,重命名该应用程序必须创建的.db文件以及我在网上找到的其他一些方法,但是没有用。 总的来说,我已经坚持了好几天。

我的代码:

主要活动

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    setGlobalContext(this);
    SQL = new SQLLib(this);

    Button LoginBtn = (Button)findViewById(R.id.login_btn);
    LoginBtn.setOnClickListener(this);
    Button RegisterBtn = (Button)findViewById(R.id.register_btn);
    RegisterBtn.setOnClickListener(this);

    newTab("Tag1", R.id.login, "Login");
    newTab("Tag2", R.id.newitem, "Nieuw");
    newTab("Tag3", R.id.viewitems, "Overzicht");

    getTabHost().setCurrentTab(0);
    hideTab(1);
    hideTab(2);
}

登录功能-附加到LoginBtn

public void Login(){
    if(Username.replaceAll(" ", "") != "" && Password.replaceAll(" ", "") != ""){
        if(SQL.SelectString("SELECT PASSWORD FROM USERLOGIN WHERE USERNAME = '"+Username+"'") == Password){
            Message("Login");
        }else{
            Message(SQL.SelectString("SELECT PASSWORD FROM USERLOGIN WHERE USERNAME = '"+Username+"'")+", "+Password);
        }
    }else{
        Message("Not all data is inserted. Try again!");
    }
}

注册功能-附加到RegisterBtn

public void Register(){
    if(Username.replaceAll(" ", "") != "" && Password.replaceAll(" ", "") != ""){
        if(SQL.SelectString("SELECT USERNAME FROM USERLOGIN WHERE USERNAME = '" + Username+"'") == ""){
            SQL.Insert("USERLOGIN", new String[]{"USERNAME", "PASSWORD"}, new String[]{"\""+Username+"\"", "\""+Password+"\""});
        }else{
            Message("User'"+Username+"' already exists!");
        }
    }else{
        Message("Not all data is inserted. Try again!");
    }
}

SQLLib

private static final String DATABASE_NAME = "pwmanagement.db";
private static final int DATABASE_VERSION = 1;

public SQLLib(Context context) {  
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {   
    db.rawQuery("CREATE TABLE userlogin (_id INTEGER PRIMARY KEY AUTOINCREMENT, USERNAME TEXT, PASSWORD TEXT);", null);
    db.rawQuery("CREATE TABLE passwords (_id INTEGER PRIMARY KEY AUTOINCREMENT, USERLOGIN INTEGER,  USERNAME TEXT, PASSWORD TEXT);", null);
}

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

}

public void Insert(String table, String[] columns, String[] contents){
    SQLiteDatabase db = this.getWritableDatabase();
    if(columns.length == contents.length){
        ContentValues values = new ContentValues();

        for(int i = 0; i < contents.length; i++){
            values.put(columns[i], contents[i]);
        }

        db.insert(table, null, values);
    }

    db.close();
}

public String SelectString(String query){
    SQLiteDatabase db = this.getReadableDatabase();
    String s = "";
    Cursor cursor;

    cursor = db.rawQuery(query, null);

    while(cursor.moveToNext()){
        s = cursor.getString(0);
    }

    db.close();
    return s.replaceAll(" ", "");
}

错误的完整LogCat

09-02 17:28:23.485: E/SQLiteLog(7569): (1) no such table: USERLOGIN
09-02 17:28:23.495: E/AndroidRuntime(7569): FATAL EXCEPTION: main
09-02 17:28:23.495: E/AndroidRuntime(7569): Process: com.example.password, PID: 7569
09-02 17:28:23.495: E/AndroidRuntime(7569): android.database.sqlite.SQLiteException: no such table: USERLOGIN (code 1): , while compiling: SELECT USERNAME FROM USERLOGIN WHERE USERNAME = 'steven'
09-02 17:28:23.495: E/AndroidRuntime(7569):     at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:923)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:534)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:65)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1370)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1309)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at com.example.password.SQLLib.SelectString(SQLLib.java:62)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at com.example.password.MainActivity.Register(MainActivity.java:85)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at com.example.password.MainActivity.onClick(MainActivity.java:50)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at android.view.View.performClick(View.java:4470)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at android.view.View$PerformClick.run(View.java:18593)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at android.os.Handler.handleCallback(Handler.java:733)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at android.os.Handler.dispatchMessage(Handler.java:95)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at android.os.Looper.loop(Looper.java:157)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at android.app.ActivityThread.main(ActivityThread.java:5867)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at java.lang.reflect.Method.invokeNative(Native Method)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at java.lang.reflect.Method.invoke(Method.java:515)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674)
09-02 17:28:23.495: E/AndroidRuntime(7569):     at dalvik.system.NativeStart.main(Native Method)

所以,我的问题是:此错误来自何处,我该如何解决? 我遵循在网上甚至在自己拥有的书中找到的步骤。

您使用了错误的指令,并且未创建表:

 db.rawQuery("CREATE TABLE...

应该:

 db.execSQL("CREATE TABLE... 

rawQuery()仅用于执行SELECT语句(SQL 查询 )。 没有其他的。
所有其他SQL 命令都通过execSQL()执行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM