为什么onCreate()函数不是由构造函数

时间:2017-01-28 14:38:32

标签: java android android-sqlite

我是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());

由于

3 个答案:

答案 0 :(得分:4)

您必须致电test.getWritableDatabase(),否则将无法执行onCreate()回调。

  

SQLiteDatabase getWritableDatabase()

     

创建和/或打开将用于阅读和的数据库   写作。第一次调用它时,将打开数据库   和onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int)   和/或onOpen(SQLiteDatabase)将被调用。

欲了解更多信息: https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getWritableDatabase()

答案 1 :(得分:1)

添加到@Lino答案,

通常,您不会在构造函数中找到像onCreate这样的生命周期钩子。 这与基本的OOPS概念有关。

构造函数的基本目的是简单地初始化对象,仅此而已。如果生命周期或某些回调方法依赖于构造函数并且失败,则对象初始化本身将失败。

将其与初始化逻辑分开将允许单独处理生命周期错误,并且不会影响对象初始化。

答案 2 :(得分:0)

您必须在DatabaseHelper类中使用getWritableDatabase()

来自Android getWritableDatabase tutorial

  

成功打开后,数据库将被缓存,因此您可以在每次需要写入数据库时​​调用此方法。 (确保在不再需要数据库时调用close()。)错误权限或完整磁盘等错误可能导致此方法失败,但如果问题得到解决,将来的尝试可能会成功。