2014-09-25 3 views
0

Я пытаюсь получить данные из пустой таблицы, и она показывает «нет такой ошибки таблицы». Вот мой код адаптера базы данных. МетодОшибка SQLite базы данных Android - нет такой таблицы

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

+0

Да, я пробовал с этим. Благодарю. – Nabid

ответ

2

У вас есть синтаксическая ошибка в вашем CREATE TABLE. integer primary autoincrement должно быть integer primary key autoincrement.

После исправления ошибки синтаксиса удалите приложение, чтобы файл базы данных был воссоздан.

Почему это не подвело вас раньше, потому что вы ловили исключения в onCreate(). Это плохая идея. Проблемы необходимо распространять вверх, так что SQLiteOpenHelper не будет думать, что настройка базы данных была успешной, когда это было не так.

+0

Большое спасибо. Он исправил ошибку. Я не могу понять, что пытался поймать исключение, почему это не сработало? Не могли бы вы объяснить последнюю строку немного больше своего ответа? – Nabid

+0

Когда вы сами поймаете исключение, 'onCreate()' обычно возвращается к вызывающему абоненту SQLiteOpenHelper', и он считает, что создание базы данных преуспело, даже несмотря на то, что таблица не была создана. – laalto

Смежные вопросы