Hợp đồng của bạn về cơ bản xác định cơ sở dữ liệu của bạn và cách mọi người tương tác với cơ sở dữ liệu thông qua Nhà cung cấp nội dung.
Một lớp hợp đồng xác định hằng số có thể trợ giúp các ứng dụng làm việc với các URI nội dung, tên cột, hành động ý định, và các tính năng khác của một nhà cung cấp nội dung. Các lớp hợp đồng không được bao gồm tự động với một nhà cung cấp; nhà phát triển của nhà cung cấp phải xác định chúng và sau đó cung cấp cho nhà phát triển khác.
Có nói rằng, bạn không nhất thiết cần Nhà cung cấp nội dung để sử dụng lớp Hợp đồng. Ví dụ của tôi chứa các hằng số được Nhà cung cấp nội dung sử dụng (Các phần MIME và URI). Nếu bạn không sử dụng Nhà cung cấp nội dung, bạn không cần những phần này.
Tôi thích nghĩ về lớp hợp đồng làm lược đồ cơ sở dữ liệu hoặc nói cách khác là thứ gì đó xác định cách cơ sở dữ liệu của bạn được thiết lập. Bạn có thể nhận thấy rằng mọi thứ trong lớp hợp đồng được khai báo là tĩnh. Đó là bởi vì bạn sẽ không bao giờ được instantiating một lớp hợp đồng, nhưng chỉ đề cập đến các hằng số được định nghĩa trong nó. Bạn có thể thấy trong ví dụ của tôi rằng lớp Contract của tôi chỉ có một loạt các biến cuối cùng được khai báo. Lớp hợp đồng này có thể là tệp riêng của nó, ví dụ: tệp của tôi được gọi là TransitContract.java.
Ví dụ: bạn muốn thay đổi tên của một trong các cột của bạn. Thay vì thực hiện thay đổi đối với nhiều tệp, tất cả những gì bạn phải làm là thay đổi giá trị cho cột trong lớp hợp đồng. Bạn không làm bất kỳ công việc tính toán nào bên trong lớp hợp đồng.
Lớp SQLLiteOpenhelper mặt khác là thứ do Google cung cấp để làm việc với cơ sở dữ liệu dễ dàng hơn. Đây là nơi bạn triển khai các phương thức tạo và thiết lập cơ sở dữ liệu ban đầu. Xem http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html. Sau khi bạn thực hiện các phương thức này, tất cả những gì bạn phải làm là khởi tạo một thể hiện của lớp helper của bạn, và sau đó gọi helperClassInstance.getWriteableDatabase() (hoặc getReadableDataBase()) và sau đó lớp helper của bạn tự động tạo một cơ sở dữ liệu mới nếu cần thiết, hoặc trả lại cái đã tồn tại, v.v.
Trình trợ giúp này thường được thực hiện như một lớp bên trong nhưng có thể là lớp độc lập của riêng nó. Tuy nhiên, bạn muốn thực hiện nó.
Tôi khuyên bạn nên xem xét ví dụ về Notepad mà Google cung cấp vì ví dụ này có một ví dụ khá hay về cách bạn có thể đặt một lớp hợp đồng. Xin lưu ý rằng họ cũng sử dụng Nhà cung cấp nội dung. Nếu bạn quan tâm đến việc tìm hiểu về Nhà cung cấp nội dung, tôi khuyên bạn nên đọc thêm một số chi tiết tại số http://developer.android.com/guide/topics/providers/content-provider-basics.html. Nó đi sâu hơn nhiều về các nhà cung cấp nội dung và các lớp hợp đồng.
Đây là ví dụ sử dụng mã của bạn. Tôi đã không thực sự kiểm tra mã này để nó có thể có lỗi. Như bạn có thể thấy, bạn có thể khởi tạo trình trợ giúp db của mình bất cứ nơi nào bạn cho là cần thiết. Trong ví dụ này tôi làm điều đó trong onCreate của hoạt động chính, nhưng trong thực tế, đây là thực hành không tốt.
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);
}
}
Và ví dụ của tôi
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
};
}
Lớp trợ giúp không phải là một phần của businessobjects ... –
vì vậy tôi nên tạo một Tệp riêng cho lớp Trình trợ giúp? – maysi