2013-07-03 25 views
26

我有點困惑,因爲我不知道我應該怎麼理解這裏的教程:http://developer.android.com/training/basics/data-storage/databases.html#DbHelper如何在android中使用契約類?

我的代碼到現在看起來是這樣的:

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

所以我應該爲助手類創建一個自己的File? – maysi

回答

91

你的合同基本上定義你的數據庫,以及如何人應通過內容提供商與它進行交互。

合同類定義幫助應用程序與 內容的URI,列名,意圖的行動,以及 其他功能內容提供商合作的常數。合同類別不會自動包含在供應商 中;供應商的開發人員必須定義它們,然後 使其可供其他開發人員使用。

話雖如此,你不一定需要一個內容提供商來使用合同類。我的例子包含內容提供者使用的常量(MIME和URI部分)。如果您不使用內容提供程序,則不需要這些部分。

我喜歡將契約類看作數據庫模式,換句話說就是定義數據庫設置方式的東西。您可能會注意到,合同類中的所有內容都被聲明爲靜態。這是因爲你永遠不會實例化一個契約類,而只能引用其中定義的常量。您可以在我的示例中看到,我的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

哇!謝謝。這就是我正在尋找的。 – maysi