Tôi đã đọc hướng dẫn về Lưu ý SQLite của Android tham chiếu tạo một lớp DB Adapter để tạo và truy cập một bảng DB. Khi giao dịch với một Cơ sở dữ liệu SQLite nhiều bảng, cách tốt nhất là tạo một Lớp bộ điều hợp khác cho mỗi bảng hoặc tạo một lớp DB Adapter duy nhất cho toàn bộ Ứng dụng Android?Nhiều Bảng SQLite DB Adapter (s) trong Android?
Ứng dụng của tôi sử dụng nhiều bảng và tôi đã hy vọng không cần phải có một lớp bộ điều hợp lớn duy nhất. vấn đề, tuy nhiên, là tôi có một lớp con lồng nhau của SQLiteOpenHelper mỗi Ví dụ NotePad trong mỗi bộ điều hợp. Khi bảng đầu tiên được truy cập, mọi thứ hoạt động tốt. Khi tôi cố gắng truy cập vào thứ hai (từ một hoạt động khác), ứng dụng của tôi gặp sự cố.
Lúc đầu, tôi cho rằng sự cố đã xảy ra do sự cố về phiên bản, nhưng cả hai bộ điều hợp giờ đây đều có cùng phiên bản cơ sở dữ liệu và nó vẫn bị lỗi.
Dưới đây là ví dụ về một trong các bộ điều hợp DB cho bảng. Các bộ điều hợp khác đều tuân theo cùng định dạng với các triển khai khác nhau.
public class InfoDBAdapter {
public static final String ROW_ID = "_id";
public static final String NAME = "name";
private static final String TAG = "InfoDbAdapter";
private static final String DATABASE_NAME = "myappdb";
private static final String DATABASE_TABLE = "usersinfo";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE = "create table usersinfo (_id integer primary key autoincrement, "
+ NAME
+ " TEXT," + ");";
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
private final Context mCtx;
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to " //$NON-NLS-1$//$NON-NLS-2$
+ newVersion + ", which will destroy all old data"); //$NON-NLS-1$
//db.execSQL("DROP TABLE IF EXISTS usersinfo"); //$NON-NLS-1$
onCreate(db);
}
}
public InfoDBAdapter(Context ctx) {
this.mCtx = ctx;
}
public InfoDBAdapter open() throws SQLException {
this.mDbHelper = new DatabaseHelper(this.mCtx);
this.mDb = this.mDbHelper.getWritableDatabase();
return this;
}
/**
* close return type: void
*/
public void close() {
this.mDbHelper.close();
}
public long createUser(String name) {
ContentValues initialValues = new ContentValues();
initialValues.put(NAME, name);
return this.mDb.insert(DATABASE_TABLE, null, initialValues);
}
public boolean deleteUser(long rowId) {
return this.mDb.delete(DATABASE_TABLE, ROW_ID + "=" + rowId, null) > 0; //$NON-NLS-1$
}
public Cursor fetchAllUsers() {
return this.mDb.query(DATABASE_TABLE, new String[] { ROW_ID,
NAME}, null, null, null, null, null);
}
public Cursor fetchUser(long rowId) throws SQLException {
Cursor mCursor =
this.mDb.query(true, DATABASE_TABLE, new String[] { ROW_ID, NAME}, ROW_ID + "=" + rowId, null, //$NON-NLS-1$
null, null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
public boolean updateUser(long rowId, String name) {
ContentValues args = new ContentValues();
args.put(NAME, name);
return this.mDb
.update(DATABASE_TABLE, args, ROW_ID + "=" + rowId, null) > 0; //$NON-NLS-1$
}
}
Khi bộ điều hợp đầu tiên, trong trường hợp này người dùng, được truy cập, mọi thứ hoạt động như mong đợi. Giả sử tôi có một bộ điều hợp khác cho thông tin bạn bè theo cùng cấu trúc như trên, khi nó được truy cập bởi một hoạt động khác, có vẻ như tôi rằng lớp con lồng nhau của SQLiteOpenHelper sẽ cố gắng tạo lại cơ sở dữ liệu. Rõ ràng có điều gì đó sai vì trong trường hợp đó, ứng dụng của tôi bị treo.
Vậy thực hành tiêu chuẩn trong Android là gì để tạo ra một bộ chuyển đổi đơn mút DB thay vì bộ điều hợp riêng lẻ trên mỗi bảng?
+1: cũng đang cố gắng để có được tâm trí của tôi xung quanh bản thân mình. Chỉ có một hoặc hai bảng, không có vấn đề gì khi đặt tất cả trong cùng một lớp bộ điều hợp DB. Tuy nhiên, nếu DB phát triển với nhiều bảng, điều đó sẽ trở nên lộn xộn. Vì vậy, thực sự quan tâm nếu có ai có thể chỉ ra một số thực hành tốt nhất trong lĩnh vực này. – Nailuj
Đây là câu hỏi tương tự nhưng với câu trả lời thực tế: http://stackoverflow.com/questions/3684678 – jcmcbeth