我是java和android studio的新手。我正在尝试编写待办事项列表应用程序。为此,我需要将用户的任务存储在数据库库中。为此我遵循本教程:
[https://www.sitepoint.com/starting-android-development-creating-todo-app/][1]
更确切地说,以下代码用于创建数据库:
package com.aziflaj.todolist.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class TaskDbHelper extends SQLiteOpenHelper {
public TaskDbHelper(Context context) {
super(context, TaskContract.DB_NAME, null, TaskContract.DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String createTable = "CREATE TABLE " + TaskContract.TaskEntry.TABLE + " ( " +
TaskContract.TaskEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
TaskContract.TaskEntry.COL_TASK_TITLE + " TEXT NOT NULL);";
db.execSQL(createTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TaskContract.TaskEntry.TABLE);
onCreate(db);
}
}
我将其修改为
package com.example.steven.myapplication;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DatabaseHandler extends SQLiteOpenHelper {
private static final String TAG = "DatabaseHandler";
private static final String DATABASE_NAME = "taskRegister";
private static final String TASK_TABLE= "task";
private static final String COLUMN_ID = "id";
private static final String COLUMN_TASK = "task";
private static final String COLUMN_STATE = "false";
public DatabaseHandler(Context context) {
super(context, "taskRegister", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
String database_table = "CREATE TABLE task (" +
"id int INTEGER PRIMARY " +
"task TEXT" +
"state TEXT )";
db.execSQL(database_table);
Log.d(TAG, "===Inside onCreate from DatabaseHandler===");
}
我自愿删除任何一行,以避免您必须阅读太多代码。 :)
是否有人可以帮助理解为什么构造函数不会调用onCreate()函数来初始化我的数据库?
我从另一个类调用我的构造函数,如:
DatabaseHandler test = new DatabaseHandler(get.Application());
由于
答案 0 :(得分:4)
您必须致电test.getWritableDatabase()
,否则将无法执行onCreate()
回调。
SQLiteDatabase getWritableDatabase()
创建和/或打开将用于阅读和的数据库 写作。第一次调用它时,将打开数据库 和onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int) 和/或onOpen(SQLiteDatabase)将被调用。
答案 1 :(得分:1)
添加到@Lino答案,
通常,您不会在构造函数中找到像onCreate
这样的生命周期钩子。
这与基本的OOPS概念有关。
构造函数的基本目的是简单地初始化对象,仅此而已。如果生命周期或某些回调方法依赖于构造函数并且失败,则对象初始化本身将失败。
将其与初始化逻辑分开将允许单独处理生命周期错误,并且不会影响对象初始化。
答案 2 :(得分:0)
您必须在DatabaseHelper类中使用getWritableDatabase()
。
来自Android getWritableDatabase
tutorial:
成功打开后,数据库将被缓存,因此您可以在每次需要写入数据库时调用此方法。 (确保在不再需要数据库时调用close()。)错误权限或完整磁盘等错误可能导致此方法失败,但如果问题得到解决,将来的尝试可能会成功。