2017-01-28 8 views
0

私はjavaとandroid studioの初心者です。私は、リストアプリケーションを行うためにコードしようとしています。これを実現するには、ユーザーのタスクをデータベースベースに格納する必要があります。onCreate()関数がコンストラクタによって呼び出されない理由

[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()関数がコンストラクタによって呼び出されない理由を理解するのに役立つ人はいますか?

私のような別のクラスからの私のコンストラクタを呼び出す:あなたはtest.getWritableDatabase()を呼び出す必要があり

DatabaseHandler test = new DatabaseHandler(get.Application()); 

おかげ

答えて

4

はそうonCreate()コールバックは実行されません。

SQLiteDatabase getWritableDatabase()

読書と 書き込みに使用されるデータベースを作成し、および/または開きます。これが初めて呼び出されると、データベースは で開き、onCreate(SQLiteDatabase)、onUpgrade(SQLiteDatabase、int、int) および/またはonOpen(SQLiteDatabase)が呼び出されます。詳細情報については

https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getWritableDatabase()

+0

ありがとうございました!なぜ私はonCreate()関数が公式アンドロイドスタジオのドキュメントで呼び出されていないのか探していたので、私はこの関数を見ませんでしたが、別の関数が明示的にonCreate()関数を呼び出すことはできないと考えました。ありがとう:) –

1

答えを@Linoに追加するには、

一般に

あなたはコンストラクタから使用されてonCreateなどのライフサイクルフックを見つけることができません。 これは基本的なOOPSの概念に関連しています。

コンストラクタの基本的な目的はです。単純にオブジェクトを初期化します。ライフサイクルまたはいくつかのコールバックメソッドがコンストラクタに依存し、それが失敗した場合、オブジェクトの初期化自体は失敗します。

初期化ロジックから分離すると、ライフサイクルエラーを個別に処理でき、オブジェクトの初期化には影響しません。

0

DatabaseHelperクラスでgetWritableDatabase()を使用する必要があります。 Android getWritableDatabase tutorialから

正常に開かれると、あなたはデータベースに書き込む必要があるたびに、このメソッドを呼び出すことができるように、データベースは、キャッシュされています。 (データベースが不要になったときにclose()を呼び出すようにしてください)。不正なアクセス権やディスクがいっぱいの場合、このメソッドは失敗する可能性がありますが、

関連する問題