2014-09-25 114 views
0

我想從一個空表中獲取數據,並顯示「沒有這樣的表錯誤」。 這是我的數據庫適配器代碼。Android的SQLite數據庫錯誤 - 沒有這樣的表

DBAdapter.java

package com.prome.testdatabase; 

import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 
import android.widget.Toast; 

/** 
* @author Md. Nabid Imteaj 
* @version 0.1 
* @see Database adapter for creating local databases 
* and also for local queries. 
*/ 
public class DBAdapter { 
    // define tag 
    public static final String TAG = "DBAdapter"; 
    // define table fields 
    static final String KEY_ID = "_id"; 
    static final String KEY_NAME = "name"; 

    // define table names 
    static final String TABLE_INFO = "info"; 
    // define database name 
    static final String DATABASE_NAME = "test_db_debug"; 
    // define database version 
    static final int DATABASE_VERSION = 1; 
    // define separators 
    static final String COMMA_SEP = ", "; 
    static final String IPA_SEP = " integer primary autoincrement "; 
    static final String INT_SEP = " integer"; 
    static final String TEXT_SEP = " TEXT"; 
    // define database creation queries 
    static final String CREATE_INFO = "create table " + TABLE_INFO + "(" 
              + KEY_ID + IPA_SEP + COMMA_SEP 
              + KEY_NAME + TEXT_SEP +")"; 

    final Context context; 
    DatabaseHelper DBHelper; 
    SQLiteDatabase db; 

    // Constructor. Creates database. 
    public DBAdapter(Context ctx) { 
     this.context = ctx; 
     // create database 
     DBHelper = new DatabaseHelper(context); 
    } 

    // ----- make private class ----- 
    private class DatabaseHelper extends SQLiteOpenHelper { 

     // constructor 
     public DatabaseHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
      //Toast.makeText(context, "DatabaseHelper Constructor", Toast.LENGTH_LONG).show(); 
      Log.d(TAG, "DatabseHelper Constructor Loaded."); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      // TODO Auto-generated method stub 
      // create databases 
      try { 
       db.execSQL(CREATE_INFO); 
       Log.d(TAG, "All tables has been created."); 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      // TODO Auto-generated method stub 
      Log.d(TAG, "Updating database from version " + oldVersion + " to " + newVersion + 
        ", which will destroy all old data."); 
      String drp = "DROP TABLE IF EXISTS "; 

      db.execSQL(drp + TABLE_INFO); 

      onCreate(db); 
     } 
    } // ----- ends private class ------ 

    // --- opens the database --- 
    public DBAdapter open() { 
     db = DBHelper.getWritableDatabase(); 
     Log.d(TAG, "Database opened."); 
     return this; 
    } 

    // --- closes the database --- 
    public void close() { 
     DBHelper.close(); 
     Log.d(TAG, "Database closed."); 
    } 

    // get all data of table 
    public Cursor getAllData() { 
     return db.query(TABLE_INFO, new String[]{ KEY_ID, KEY_NAME }, null, null, null, null, null); 
    } 
} 

在MainActivity.java> onCreate()方法:

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

    DBAdapter db = new DBAdapter(this); 
    db.open(); 
    Cursor c = db.getAllData(); 
    while(!c.isAfterLast()) { 
     Log.d("DB", "id: "+c.getString(0)+", name: "+c.getString(1)); 
     c.moveToNext(); 
    } 
    db.close(); 
} 

請解釋什麼,在哪裏是缺陷和得到一種溶液。提前致謝。

+0

您是否已經卸載了應用程序以擺脫任何可能的舊版數據庫文件? – laalto 2014-09-25 20:17:19

+0

是的,我試過了。謝謝。 – Nabid 2014-09-25 20:35:42

回答

2

您的CREATE TABLE中有語法錯誤。 integer primary autoincrement應該是integer primary key autoincrement

修復語法錯誤後,請卸載您的應用程序,以便重新創建數據庫文件。

爲什麼它沒有失敗,因爲你在onCreate()捕捉異常。這是一個壞主意。問題需要向上傳播,以至於SQLiteOpenHelper不會認爲數據庫設置在不成功時是成功的。

+0

非常感謝。它修復了錯誤。我無法理解我在試圖捕捉一個異常,爲什麼它沒有工作? 你能解釋最後一行多一點你的答案嗎? – Nabid 2014-09-25 21:29:09

+0

當你自己捕獲異常時,'onCreate()'通常返回到'SQLiteOpenHelper'調用者,它認爲即使沒有創建表,數據庫創建也是成功的。 – laalto 2014-09-25 21:31:12

相關問題