Таблица не создается в SQLite - PullRequest
0 голосов
/ 28 января 2012

Я пытаюсь создать базу данных SQLite и заполнить ее данными. Когда я запускаю программу через отладчик в Eclipse, на экране ничего не появляется, но я получаю следующее от LogCat:

sqlite returned: error code = 1, msg = no such table: Issues

Вот код (я постараюсь показать только то, что нужно, но если вам нужно больше, пожалуйста, дайте мне знать):

MainActivity.java

public class MainActivity extends Activity {

//TAG for LogCat.
public static final String TAG = "SQLiteDebug";
private ListView mListViewIssues;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //Load listview control.
    mListViewIssues = (ListView)findViewById(R.id.listIssues);

    //Create Data Creator.
    IssueInfoCreator creator = new IssueInfoCreator(this);

    creator.open();
    try {
        creator.insertRandomData();
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    //add data to listview through adapter.
    mListViewIssues.setAdapter(new IssueInfoAdapter(this, creator.queryAll()));

    //Close connection.
    creator.close();
}
}

Код для IssueInfoCreator:

public class IssueInfoCreator {

//DB Adapter.
private DBAdapter mDBAdapter;

//Constructor.
public IssueInfoCreator(Context c){
    mDBAdapter = new DBAdapter(c);
}

//Open DBAdapter.
public void open(){
    mDBAdapter.open();
}

//Insert Random Data to get started.
public void insertRandomData() throws ParseException{
    long i = 999;
    Date dtDate = new Date();
    dtDate.parse("1/12/2012");

    mDBAdapter.insertIssue(i++, dtDate, "This is my ticket.  I'm having trouble starting my sim.");
    mDBAdapter.insertIssue(i++, dtDate, "I can't my sim to turn on, please help.");
    mDBAdapter.insertIssue(i++, dtDate, "Aircraft is not responding to callsign.");
    mDBAdapter.insertIssue(i++, dtDate, "TTS is not recognising when we attempt to land an aircraft.");
}

//Get all Issues from DB.
public List<IssueInfo> queryAll(){
    return mDBAdapter.fetchAllIssues();
}

//close connection.
public void close(){
    mDBAdapter.close();
}
}

Код для DBAdapter:

public class DBAdapter {

//Database fields.
public static final String ISSUES_TABLE = "Issues";
public static final String COL_ISSUE_ID = "_id";
public static final String COL_DATE_RECEIVED = "DateReceived";
public static final String COL_ISSUE_SUMMARY = "IssueSummary";

//Declarations.
private Context mContext;
private SQLiteDatabase mDB;
private DBHelper mDBHelper;

//Constructor.
public DBAdapter(Context c){
    mContext = c;
}

//Open DB Connection.
public DBAdapter open() throws SQLException{
    mDBHelper = new DBHelper(mContext);
    mDB = mDBHelper.getWritableDatabase();
    return this;
}

//Close DB Connection.
public void close(){
    mDBHelper.close();
}
//remaining code omitted for brevity...
}

и, наконец, код для DBHelper:

public class DBHelper extends SQLiteOpenHelper {

//Constants
private static final String DB_NAME = "dbOpenIssues";
private static final int DB_VERSION = 1;
private static final String CREATE_DB_SQL = 
        "CREATE TABLE Issues ( " +
                "_id int PRIMARY KEY, " +
                "DateReceived datetime NOT NULL, " +
                "IssueSummary text NOT NULL " +
                ");";
private static final String DROP_TABLE = 
        "DROP TABLE IF EXISTS Issues";

public DBHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
}

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

@Override   
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL(DROP_TABLE);
    onCreate(db);
}
}

Если я запускаю его с подключенным эмулятором, я вижу, что БД создается в проводнике, но если я опускаю его локально и открываю с помощью SQLiteMan, он показывает только таблицу android_metadata.

Есть идеи? опять же, извините за длинный пост, просто не хотел ничего упускать и должен делать репост 10 раз.

UPDATE:

Одна вещь, которую я попытался, состояла в том, чтобы напечатать инструкцию SQL в LogCat, но я заметил, что onCreate (в DBHelper) никогда не вызывается:

public void onCreate(SQLiteDatabase db){
    Log.e("DB ERROR -- ", CREATE_DB_SQL);
    db.execSQL(CREATE_DB_SQL);
}

Ответы [ 3 ]

2 голосов
/ 28 января 2012

В SQLite нет типа datetime. Для хранения данных вы можете использовать TEXT. Так что в вашем случае запрос может быть следующим:

private static final String CREATE_DB_SQL = 
        "CREATE TABLE Issues (" +
                "_id integer PRIMARY KEY, " +
                "DateReceived text NOT NULL, " +
                "IssueSummary text NOT NULL)";

Здесь - ссылка на типы данных.

0 голосов
/ 28 января 2012

Вы пытались запустить оператор SQL Create в эмуляторе с помощью adb?

Вот дополнительная информация по adb, если вы не знакомы: http://developer.android.com/guide/developing/tools/adb.html

При отладке проблем sqlite на Android я считаю, что проще всего запускать команды SQL вручную из эмулятора.

0 голосов
/ 28 января 2012

onCreate() вызывается при первом создании базы данных.Таким образом, если таблицу не удалось создать, но база данных уже была создана, onCreate() больше не будет вызываться.

Удалите базу данных и перезапустите программу с любыми изменениями, которые вы внесли, чтобы увидеть, если онаработает сейчас ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...