[英]In Android ContentProvider backed by SQLite, how should I implement insertOrUpdate semantics?
[英]ContentProvider Sqlite and many users. Should I create individual db`s for users or how to control that
如標題所說。 我正在尋找解決方案,但我想我走錯了路。 我覺得最簡單的方法是在應用程序識別到用戶更改后設置新的數據庫。 最多2-3個用戶。 對於所有用戶, ContentProvider
的流都是相同的。 好吧,是的,我可以用一些用戶ID標記所有插入的內容,但這聽起來很簡單:)如果需要,我可以刪除ContentProvider
。 有什么好的方法的想法嗎?
經過一些研究,我發現ContentProvider
在應用程序之前加載,因此很難更改數據庫名稱。 在這種情況下, SQLiteOpenHelper
onUpgrade()
需要升級許多數據庫文件。 Manifest注冊的ContentProvider
數據庫名稱是否用石頭寫?
這是表格布局的一部分,我還有更多,比如10張桌子
public final class TableUser {
public TableUser() {
}
public static final class User implements BaseColumns {
private User() {
}
public static final Uri CONTENT_URI = Uri.parse("content://" + UserContentProvider.AUTHORITY + "/user");
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.doktor.user";
public static final String USER_ID = "_id";
public static final String UUID = "uuid";
public static final String USERNAME = "username";
public static final String USERPASSWORD = "userpassword";
public static final String REGISTRATIONID = "registrationid";
public static final String LAST_LOGGED_IN = "lastloggedin";
}
public static final class FriendRequests implements BaseColumns {
private FriendRequests() {
}
public static final Uri CONTENT_URI = Uri.parse("content://" + UserContentProvider.AUTHORITY + "/friendRequests");
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.doktor.friendRequests";
public static final String FRIENDREQUESTS_ID = "_id";
public static final String NAME = "name";
public static final String UUID = "uuid";
public static final String MESSAGE = "message";
public static final String NOTIFICATION_ID = "notification_id";
public static final String DEVICE_TYPE = "device_type";
public static final String ADDEDDATE = "added_date";
}
}
這是表的創建
db.execSQL("CREATE TABLE " + USER_TABLE_NAME + " (" +
User.USER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
User.UUID + " VARCHAR(255)," +
User.USERNAME + " VARCHAR(255)," +
User.USERPASSWORD + " VARCHAR(255)," +
User.REGISTRATIONID + " LONGTEXT," +
User.LAST_LOGGED_IN + " VARCHAR(255)" + ");");
db.execSQL("CREATE TABLE " + FRIEND_REQUEST_TABLE_NAME + " (" +
FriendRequests.FRIENDREQUESTS_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
FriendRequests.NAME + " VARCHAR(255)," +
FriendRequests.UUID + " VARCHAR(255)," +
FriendRequests.MESSAGE + " VARCHAR(255)," +
FriendRequests.NOTIFICATION_ID + " VARCHAR(255)," +
FriendRequests.DEVICE_TYPE + " VARCHAR(255)," +
FriendRequests.ADDEDDATE + " VARCHAR(255)" + ");");
正如我在評論中所說,我將使用一個數據庫,其中包含您擁有的每個表中的所有數據(來自所有可能的用戶),另外一個額外的列代表實際的用戶標識符(存在於您需要用戶標識的任何表中)。 然后,您將使用此列來過濾常規數據庫查詢(插入,查詢等),以僅獲取/修改該特定用戶的數據。 如果使用ContentProvider
,則必須通過Uri
傳遞該標識符,然后使用AND user_identif=user_id_extracted_from_uri
將其附加到常規選擇子句中。
而且您可以使用電子郵件地址作為標識符,這將在設備之間更可靠,而不是某些生成的用戶ID。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.