2013-07-03 5 views
26

私はここにチュートリアルをどのように解釈すべきかわからないので、私は少し混乱しています:http://developer.android.com/training/basics/data-storage/databases.html#DbHelperアンドロイドで契約クラスを使用するには?

私のコード今、このようになりますまで:

public final class DatabaseContract { 
// To prevent someone from accidentally instantiating the contract class, 
// give it an empty constructor. 
public DatabaseContract() {} 

public static abstract class Table1 implements BaseColumns { 
    public static final String TABLE_NAME  = "nameOfTable"; 
    public static final String COLUMN_NAME_COL1 = "column1"; 
    public static final String COLUMN_NAME_COL2 = "column2"; 
    public static final String COLUMN_NAME_COL3 = "column3"; 
} 

public class DatabaseHelper extends SQLiteOpenHelper { 
    // If you change the database schema, you must increment the database version. 
    public static final int DATABASE_VERSION = 1; 
    public static final String DATABASE_NAME  = "database.db"; 
    private static final String TEXT_TYPE   = " TEXT"; 
    private static final String COMMA_SEP   = ","; 
    private static final String SQL_CREATE_ENTRIES = "CREATE TABLE " + 
      Table1.TABLE_NAME + " (" + 
      Table1._ID + " INTEGER PRIMARY KEY," + 
      Table1.COLUMN_NAME_COL1 + TEXT_TYPE + COMMA_SEP + 
      Table1.COLUMN_NAME_COL2 + TEXT_TYPE + COMMA_SEP + 
      Table1.COLUMN_NAME_COL3 + TEXT_TYPE + COMMA_SEP + ")"; 
    private static final String SQL_DELETE_ALL_ENTRIES = "DROP TABLE IF EXISTS " + Table1.TABLE_NAME; 

    public DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    // Method is called during creation of the database 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(SQL_CREATE_ENTRIES); 
    } 

    // Method is called during an upgrade of the database 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     Log.w(DatabaseHelper.class.getName(), "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); 

     db.execSQL(SQL_DELETE_ALL_ENTRIES); 
     onCreate(db); 
    } 
} 
} 

私は右のそれを解釈したりしていましたHelperクラスの最初の6つの変数は、Contractクラスの外にありますか? ヘルパークラスは契約クラスの内部クラスではありませんか?

は、あなたが私に役立つことを願って

+0

ヘルパークラスはbusinessobjects ... –

+0

の一部ではないので、私はヘルパークラス用に独自のファイルを作成する必要がありますか? – maysi

答えて

91

データベースとあなたの契約は基本的に定義し、人々がコンテンツプロバイダ経由と対話する方法。

契約クラスは、アプリケーションが コンテンツのURI、列名、意図アクション、および コンテンツプロバイダの他の機能の操作に役立つ定数を定義します。契約クラスはプロバイダに自動的に含まれません プロバイダの開発者はそれらを定義してから を他の開発者が利用できるようにしなければなりません。

これは、契約クラスを使用するために必ずしもコンテンツプロバイダが必要というわけではありません。私の例は、コンテンツプロバイダ(MIMEとURIの部分)によって使用される定数を含んでいます。コンテンツプロバイダを使用していない場合は、これらのセクションは必要ありません。

私は、契約クラスをデータベーススキーマ、つまりデータベースの設定方法を定義するものと考えています。契約クラス内のすべてが静的として宣言されていることに気付くかもしれません。これは、Contractクラスをインスタンス化することは決してありませんが、定義されている定数だけを参照するためです。私の例では、Contractクラスに静的な最終変数が宣言されていることがわかります。このContractクラスは、独自のファイルにすることができます。私のファイルはTransitContract.javaと呼ばれています。

例えば、あなたの列の名前を変更したいとします。複数のファイルを変更するのではなく、契約クラスの列の値を変更するだけです。 あなたは、契約クラス内でどんな種類の計算作業も行っていません。

一方、SQLLiteOpenhelperクラスは、データベースでの作業を容易にするためにGoogleによって提供されたものです。ここでは、初期データベースを作成および設定するメソッドを実装します。 http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.htmlを参照してください。これらのメソッドを実装したら、ヘルパークラスのインスタンスをインスタンス化してからhelperClassInstance.getWriteableDatabase()(またはgetReadableDataBase())をコールするだけで、必要に応じてヘルパークラスが自動的に新しいデータベースを作成します。

このヘルパーは、通常、内部クラスとして実装されますが、独自のスタンドアロンクラスである可能性があります。しかし、それを実装したいのです。

Googleが提供するメモ帳の例を見ることをお勧めします。これは、契約クラスをどのように設定できるかを示す良い例です。彼らはまた、コンテンツプロバイダを使用することに注意してください。あなたがコンテンツプロバイダについて学ぶことに興味があるなら、http://developer.android.com/guide/topics/providers/content-provider-basics.htmlでもっと読むことをお勧めします。それは、コンテンツプロバイダーと契約のクラスについてもっと深く入ります。

コードを使用した例を示します。実際にこのコードをテストしていないので、エラーが発生する可能性があります。ご覧のように、必要と思われる場所にdb helperをインスタンス化することができます。この例では、メインアクティビティのonCreateで行いますが、現実にはこれは悪い習慣です。

DatabaseContract.java

public final class DatabaseContract { 

    public static final int DATABASE_VERSION = 1; 
    public static final String DATABASE_NAME  = "database.db"; 
    private static final String TEXT_TYPE   = " TEXT"; 
    private static final String COMMA_SEP   = ","; 

    // To prevent someone from accidentally instantiating the contract class, 
    // give it an empty constructor. 
    private DatabaseContract() {} 

    public static abstract class Table1 implements BaseColumns { 
     public static final String TABLE_NAME  = "nameOfTable"; 
     public static final String COLUMN_NAME_COL1 = "column1"; 
     public static final String COLUMN_NAME_COL2 = "column2"; 
     public static final String COLUMN_NAME_COL3 = "column3"; 


     public static final String CREATE_TABLE = "CREATE TABLE " + 
       TABLE_NAME + " (" + 
       _ID + " INTEGER PRIMARY KEY," + 
       COLUMN_NAME_COL1 + TEXT_TYPE + COMMA_SEP + 
       COLUMN_NAME_COL2 + TEXT_TYPE + COMMA_SEP + 
       COLUMN_NAME_COL3 + TEXT_TYPE + ")"; 
     public static final String DELETE_TABLE = "DROP TABLE IF EXISTS " + TABLE_NAME; 
    } 
} 

DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper {  
    public DatabaseHelper(Context context) { 
     super(context, DatabaseContract.DATABASE_NAME, null, DatabaseContract.DATABASE_VERSION); 
    } 

    // Method is called during creation of the database 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(DatabaseContract.Table1.CREATE_TABLE); 
    } 

    // Method is called during an upgrade of the database 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL(DatabaseContract.Table1.DELETE_TABLE); 
     onCreate(db); 
    } 
} 

MainActivity.java

public class MainActivity extends Activity { 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Create new helper 
     DatabaseHelper dbHelper = new DatabaseHelper(getContext()); 
     // Get the database. If it does not exist, this is where it will 
     // also be created. 
     SQLiteDatabase db = dbHelper.getWriteableDatabase(); 

     // Create insert entries 
     ContentValues values = new ContentValues(); 
     values.put(DatabaseContract.Table1.COLUMN_NAME_COL1, "value1"); 
     values.put(DatabaseContract.Table1.COLUMN_NAME_COL2, "value2"); 
     values.put(DatabaseContract.Table1.COLUMN_NAME_COL3, "value3"); 

     // Insert the new row, returning the primary key value of the new row 
     long newRowId; 
     newRowId = db.insert(
       DatabaseContract.Table1.TABLE_NAME, 
       null, 
       values); 
    } 
} 

そして、私の例

public final class TransitContract { 
    public static final String AUTHORITY = "com.example.TransitProvider"; 
    public static final String SCHEME = "content://"; 
    public static final String SLASH = "/"; 
    public static final String DATABASE_NAME = "transit.db"; 

    /* An array list of all the SQL create table statements */ 
    public static final String[] SQL_CREATE_TABLE_ARRAY = { 
     Agency.CREATE_TABLE, 
     CalendarDates.CREATE_TABLE, 
     Calendar.CREATE_TABLE, 
     Routes.CREATE_TABLE, 
     Shapes.CREATE_TABLE, 
     Stops.CREATE_TABLE, 
     StopTimes.CREATE_TABLE, 
     Trips.CREATE_TABLE 
    }; 

    /** 
    * Array of resource ids for each GTFS data file that will be loaded into 
    * database 
    */ 
    public static final int[] RAW_IDS = { 
     R.raw.agency, 
     R.raw.calendar_dates, 
     R.raw.calendar, 
     R.raw.routes, 
     R.raw.shapes, 
     R.raw.stops, 
     R.raw.stop_times, 
     R.raw.trips, 
    }; 

    /* Do not allow this class to be instantiated */ 
    private TransitContract() {} 

    public static final class Agency implements BaseColumns { 
     /* Do not allow this class to be instantiated */ 
     private Agency() {} 

     public static final String TABLE_NAME = "Agency"; 

     public static final String KEY_AGENCY_ID = "AgencyId"; 

     public static final String KEY_NAME = "Name"; 

     public static final String KEY_URL = "Url"; 

     public static final String KEY_TIMEZONE = "Timezone"; 

     public static final String KEY_LANG = "Language"; 

     public static final String KEY_PHONE = "PhoneNumber"; 

     public static final String KEY_FARE_URL = "FareUrl"; 

     /* 
     * URI definitions 
     */ 

     /** 
     * The content style URI 
     */ 
     public static final Uri CONTENT_URI = Uri.parse(SCHEME + AUTHORITY + SLASH + TABLE_NAME); 

     /** 
     * The content URI base for a single row. An ID must be appended. 
     */ 
     public static final Uri CONTENT_ID_URI_BASE = Uri.parse(SCHEME + AUTHORITY + SLASH + TABLE_NAME + SLASH); 

     /** 
     * The default sort order for this table 
     */ 
     public static final String DEFAULT_SORT_ORDER = KEY_AGENCY_ID + " ASC"; 

     /* 
     * MIME type definitions 
     */ 

     /** 
     * The MIME type of {@link #CONTENT_URI} providing rows 
     */ 
     public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + 
               "/vnd.com.marylandtransitcommuters.agency"; 

     /** 
     * The MIME type of a {@link #CONTENT_URI} single row 
     */ 
     public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE + 
               "/vnd.com.marylandtransitcommuters.agency"; 

     /** 
     * SQL Statement to create the routes table 
     */ 
     public static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" 
                + _ID + " INTEGER PRIMARY KEY," 
                + KEY_AGENCY_ID + " TEXT," 
                + KEY_NAME + " TEXT," 
                + KEY_URL + " TEXT," 
                + KEY_TIMEZONE + " TEXT," 
                + KEY_LANG + " TEXT," 
                + KEY_PHONE + " TEXT," 
                + KEY_FARE_URL + " TEXT" 
                + ");"; 

     /** 
     * SQL statement to delete the table 
     */ 
     public static final String DELETE_TABLE = "DROP TABLE IF EXISTS " + TABLE_NAME; 

     /** 
     * Array of all the columns. Makes for cleaner code 
     */ 
     public static final String[] KEY_ARRAY = { 
      KEY_AGENCY_ID, 
      KEY_NAME, 
      KEY_URL, 
      KEY_TIMEZONE, 
      KEY_LANG, 
      KEY_PHONE, 
      KEY_FARE_URL 
     }; 
    } 
+0

うわー。どうもありがとうございました。しかし、私はまだ契約クラスとヘルパークラスの間の違いを知らない。契約には何があり、ヘルパーには何がありますか。ヘルパーと契約クラスの異なるファイルですか? – maysi

+0

私は自分の答えを更新しました。 – btse

+0

WOW !!!ありがとうございました。それはまさに私が探していたものです。 – maysi

関連する問題