【问题标题】:Unable to create second SQLite table in Android [duplicate]无法在 Android 中创建第二个 SQLite 表 [重复]
【发布时间】:2018-09-04 09:03:34
【问题描述】:
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);

【问题讨论】:

  • 同样的问题?如果你卸载并再次运行?
  • 是的,这似乎解决了它哈哈。我假设每次您点击“播放按钮”时它都会卸载并重新安装。非常感谢!
  • 尝试添加Log.d("query",SQL_CREATE_Label_DATABASE)并评论结果

标签: android sql sqlite


【解决方案1】:

您的代码看起来不错,使用 SQlite 数据库时的常见错误通常是在重新构建它们时。如果您对数据库的结构进行了任何更改(或为此更改了数据库中的数据),您应该从您的设备或模拟器中卸载该应用程序,然后尝试再次运行该程序。这将销毁并使用更改重新创建您的数据库。

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

另外,另一个快速“Hack”是将您的数据库名称更改为空。 //你数据库助手构造函数 公共数据库助手(上下文 myContext){ //上下文,DatabaseName,CursorFactory,DatabaseVersion super(myContext,null,null,myDatabaseVersionNumber);

这样做会导致数据库在您每次启动应用程序(或按 IDE 中的“播放按钮”)时销毁并从 squre 1 重新创建自身。在编码和测试数据库时,这是一个很棒的“hack”,但是请记住,稍后只要您希望它像数据库一样工作(即实际存储信息并重用存储的值),请为您的数据库设置一个名称!

【讨论】:

  • 我为任何需要的人添加了“生活小窍门”
猜你喜欢
  • 2013-05-15
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多