你的合同基本上定義你的數據庫,以及如何人應通過內容提供商與它進行交互。
合同類定義幫助應用程序與 內容的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
};
}
助手類不是businessobjects的一部分... –
所以我應該爲助手類創建一個自己的File? – maysi