无法在Android中创建第二个SQLite表

时间:2018-09-04 09:03:35

标签: android sql sqlite

public class taskDBHelper extends SQLiteOpenHelper {

//To help with identifying log messages
public static final String LOG_TAG = taskDBHelper.class.getSimpleName();

/** Name of the database file */
private static final String DATABASE_NAME = "taskDataBase.db";
/**
 * Database version. If you change the database schema, you must increment the database version.
 */
private static final int DATABASE_VERSION = 1;


/**
 * Constructs a new instance of {@link taskDBHelper}
 * calls the SQLiteOpenHelper database superclass.
 *
 * @param context that the app is in
 */
public taskDBHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

/**This is called when the database is created for the very first time
 * @param db
 */
@Override
public void onCreate(SQLiteDatabase db) {
    //This string is used to create the table for tasks
    String SQL_CREATE_TASK_DATABASE = "CREATE TABLE " + taskContract.TaskEntry.TABLE_NAME + " ("
            + taskContract.TaskEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
            + taskContract.TaskEntry.COLUMN_TASK_TITLE + " TEXT NOT NULL, "
            + taskContract.TaskEntry.COLUMN_DESCRIPTION + " TEXT, "
            + taskContract.TaskEntry.COLUMN_DATE + " INTEGER DEFAULT 0, "
            + taskContract.TaskEntry.COLUMN_LAST_COMPLETED + " INTEGER DEFAULT 0, "
            + taskContract.TaskEntry.COLUMN_TIME + " TEXT NOT NULL DEFAULT 0, "
            + taskContract.TaskEntry.COLUMN_RECCURING_PERIOD + " INTEGER NOT NULL DEFAULT 0, "
            + taskContract.TaskEntry.COLUMN_HISTORY + " TEXT, "
            + taskContract.TaskEntry.COLUMN_TYPE_TASK + " INTEGER NOT NULL, "
            + taskContract.TaskEntry.COLUMN_STATUS + " INTEGER NOT NULL)";
    db.execSQL(SQL_CREATE_TASK_DATABASE);


    //This String creates table for

    String SQL_CREATE_Label_DATABASE = "CREATE TABLE " + taskContract.TaskEntry.LABEL_TABLE_NAME + " ("
            + taskContract.TaskEntry.Label_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
            + taskContract.TaskEntry.COLUMN_LABEL_NAME + " TEXT NOT NULL)";
    db.execSQL(SQL_CREATE_Label_DATABASE);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    //not used
    //onCreate(db);
    db.execSQL("DROP TABLE IF EXISTS "+ taskContract.TaskEntry.TABLE_NAME);
    db.execSQL("DROP TABLE IF EXISTS "+taskContract.TaskEntry.LABEL_TABLE_NAME);
    onCreate(db);
}

}

第一个表已创建并按预期工作,但第二个表未执行,我试图用分号结束两个语句,但这无济于事。 每当我尝试访问第二张表时,它会告诉我该表不存在。任何帮助将不胜感激,谢谢:)

    taskDBHelper mDbHelper = new taskDBHelper(this);
    SQLiteDatabase db = mDbHelper.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(taskContract.TaskEntry.COLUMN_LABEL_NAME, newTextLabel);

    db.insert(taskContract.TaskEntry.LABEL_TABLE_NAME,null,cv);

1 个答案:

答案 0 :(得分:1)

您的代码看起来不错,在重建SQlite数据库时,这通常是一个常见错误。如果您对数据库的结构进行了任何更改(或为此更改了数据库中的数据),则应从设备或仿真器中取消应用程序的安装,然后尝试再次运行该程序。这将破坏并重新创建您的数据库。

我曾经以为自动运行该应用程序会破坏并重新创建我的数据库,但事实并非如此。

另外,另一个快捷的“ Hack”是将数据库名称更改为null。     //您的数据库助手构造函数      公共DatabaseHelper(Context myContext){         //上下文,数据库名称,游标工厂,数据库版本         超级(myContext,null,null,myDatabaseVersionNumber);

这样做将导致数据库每次启动应用程序(或在IDE中按“播放按钮”)时都从squre 1中破坏并重新创建自身。在对数据库进行编码和测试时,这是一个不错的“ hack”,但是请记住,以后要让它像数据库一样工作时(即实际存储信息并重用存储的值),请为数据库设置一个名称!