如何根据特定用户 kotlin 显示内容
How to make the content displayed depending on a particular user kotlin
本题不会有代码。想象一下,我有一个应用程序,其中有一个完整的用户注册,注册后,一个帐户被登录。让它成为一个运动鞋商店。因此,这里是所有产品的列表(RecyclerView),用户可以将一些产品添加到他的收藏夹中。问题是如何确保每个注册用户都有自己的收藏夹列表,这样他自然不会看到别人的收藏夹列表。我对如何通过 Firebase 或 ROOM 数据库完成此操作很感兴趣。
如果缩短问题,听起来可能像这样:如何根据特定用户显示内容
这可能是一个 many-many 关系,所以在房间里你会有一个 table 的用户,一个 table 的可以收藏的项目,然后是table 映射 user/favourite 组合。这个 table 通常只会存储两个 references/relationships/maps/associations ... 一个给用户,另一个给收藏夹。
这样一个项目可以被许多用户收藏,一个用户可以有任何收藏。您将使用 SELECT 查询提取用户收藏夹列表,该查询具有对用户的引用的 WHERE 子句。
作为使用 Room 的工作示例:-
用户table(房间里的实体):-
@Entity
data class User(
@PrimaryKey
val userId: Long? = null,
val username: String,
val userPassword: String
)
项目table/entity:-
@Entity
data class Item(
@PrimaryKey
val itemId: Long? = null,
val itemName: String
)
mapping/relationship/associative .... table UserItemFavourite :-
@Entity(
primaryKeys = ["userIdMap","itemIdMap"],
/* Foreign Keys enforce referential integrity */
foreignKeys = [
ForeignKey(entity = User::class, parentColumns = ["userId"],childColumns = ["userIdMap"], onDelete = CASCADE, onUpdate = CASCADE),
ForeignKey(entity = Item::class, parentColumns = ["itemId"],childColumns = ["itemIdMap"], onDelete = CASCADE, onUpdate = CASCADE)
],
indices = [Index("itemIdMap")]
)
data class UserItemFavourite(
val userIdMap: Long,
val itemIdMap: Long
)
一个 POJO(非实体),用于让用户获得最喜欢的项目列表 UserWithFavouriteItems :-
data class UserWithFavouriteItems (
@Embedded
val user: User,
@Relation(
entity = Item::class,
parentColumn = "userId",
entityColumn = "itemId" ,
associateBy = Junction(
value = UserItemFavourite::class,
parentColumn = "userIdMap",
entityColumn = "itemIdMap"
)
)
val itemList: List<Item>
)
另一个用于获取项目计数的 POJO(奖励)是最喜欢的:-
data class FavouriteItems(
@Embedded
val item: Item,
val favouredcount: Long
)
一些Dao的(数据库交互函数)AllDao》-
@Dao
abstract class AllDao {
@Insert
abstract fun insert(user: User): Long
@Insert
abstract fun insert(item: Item): Long
@Insert
abstract fun insert(userItemFavourite: UserItemFavourite): Long
@Query("SELECT coalesce(userid,-1) FROM user WHERE username=:userName AND userPassword=:password")
abstract fun login(userName: String, password: String): Long
@Query("SELECT * FROM user")
abstract fun getAllusers(): List<User>
@Query("SELECT * from user WHERE userid=:userId")
abstract fun getUserWithFavouriteItems(userId: Long): UserWithFavouriteItems
@Query("SELECT item.*, (SELECT count(*) FROM useritemfavourite WHERE itemIdMap = itemid) AS favouredcount FROM item ORDER BY favouredcount DESC")
abstract fun getFavouriteItemsList(): List<FavouriteItems>
@Query("SELECT (SELECT count(*) FROM user) + (SELECT count(*) FROM item) > 0")
abstract fun isData(): Boolean
}
数据库 (@Database) class(告诉数据库它是实体,并允许通过数据库实例获取 dao(s) 的实例)这个还包括获取数据库:-
@Database(entities = [User::class,Item::class,UserItemFavourite::class],version = 1)
abstract class TheDatabase: RoomDatabase() {
abstract fun getAllDao(): AllDao
companion object {
var instance: TheDatabase? = null
fun getInstance(context: Context): TheDatabase {
if (instance == null) {
instance = Room.databaseBuilder(
context,
TheDatabase::class.java,
"thedb.db"
)
.allowMainThreadQueries()
.build()
}
return instance as TheDatabase
}
}
}
- for convenience/brevity demo 可以在主线程运行
最后把它们放在一起 Activity :-
class MainActivity : AppCompatActivity() {
lateinit var db: TheDatabase
lateinit var dao: AllDao
val TAG = "USERINFO"
var currentUserid: Long = -1L;
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
db = TheDatabase.getInstance(this)
dao = db.getAllDao()
val passwordAttempts = listOf<String>("notpasswordsarah","passwordsrahnot","passwordsarah")
addSomeData()
for(s: String in passwordAttempts) {
if (login("sarah",s)) break
}
val currentUserWithFavourites = dao.getUserWithFavouriteItems(currentUserid)
Log.d(TAG,"User logged in is ${currentUserWithFavourites.user.username}. Favourites are :-")
for (i: Item in currentUserWithFavourites.itemList) {
Log.d(TAG,"\tFavourite Item is ${i.itemName}")
}
val favouriteItems = dao.getFavouriteItemsList()
for (fi in favouriteItems) {
Log.d(TAG,"Item is ${fi.item.itemName} favourite count is ${fi.favouredcount}")
}
}
private fun addSomeData() {
val test = dao.isData()
if (!dao.isData()) {
val u1 = dao.insert(User(username = "Fred",userPassword = "passwordfred"))
val u2 = dao.insert(User(username = "mary",userPassword = "passwordmary"))
val u3 = dao.insert(User(username = "sarah",userPassword = "passwordsarah"))
val i1 = dao.insert(Item(itemName = "Book"))
val i2 = dao.insert(Item(itemName = "Diary"))
val i3 =dao.insert(Item(itemName = "Pad"))
val i4 = dao.insert(Item(itemName = "Pencil"))
val i5 = dao.insert(Item(itemName = "Pen"))
val i6 = dao.insert(Item(itemName = "Highlighter"))
val i7 = dao.insert(Item(itemName = "Ruler"))
val i8 = dao.insert(Item(itemName = "Compass"))
dao.insert(UserItemFavourite(userIdMap = u1, itemIdMap = i1)) /* Fred has Book */
dao.insert(UserItemFavourite(userIdMap = u1, itemIdMap = i5)) /* Fred has Pen */
dao.insert(UserItemFavourite(userIdMap = u1, itemIdMap = i7)) /* Fred has Ruler */
dao.insert(UserItemFavourite(userIdMap = u3, itemIdMap = i2)) /* Sarah has Diary */
dao.insert(UserItemFavourite(userIdMap = u3,i7)) /* Sarah has Ruler */
}
}
private fun login(username: String, password: String): Boolean {
currentUserid = dao.login(username,password)
if (currentUserid > 0 ) {
Log.d(TAG,"Successfully Logged In.")
} else {
Log.d(TAG,"Login unsuccessful.")
}
return currentUserid > 0
}
}
结果输出到日志:-
2021-07-19 13:56:09.820 D/USERINFO: Login unsuccessful.
2021-07-19 13:56:09.821 D/USERINFO: Login unsuccessful.
2021-07-19 13:56:09.822 D/USERINFO: Successfully Logged In.
2021-07-19 13:56:09.828 D/USERINFO: User logged in is sarah. Favourites are :-
2021-07-19 13:56:09.828 D/USERINFO: Favourite Item is Diary
2021-07-19 13:56:09.828 D/USERINFO: Favourite Item is Ruler
2021-07-19 13:56:09.830 D/USERINFO: Item is Ruler favourite count is 2
2021-07-19 13:56:09.830 D/USERINFO: Item is Book favourite count is 1
2021-07-19 13:56:09.830 D/USERINFO: Item is Diary favourite count is 1
2021-07-19 13:56:09.830 D/USERINFO: Item is Pen favourite count is 1
2021-07-19 13:56:09.830 D/USERINFO: Item is Pad favourite count is 0
2021-07-19 13:56:09.830 D/USERINFO: Item is Pencil favourite count is 0
2021-07-19 13:56:09.830 D/USERINFO: Item is Highlighter favourite count is 0
2021-07-19 13:56:09.831 D/USERINFO: Item is Compass favourite count is 0
重要 上面的代码只是为了演示,因此简洁并且缺少某些方面(不应该)接受table 对于已发布的应用程序。
本题不会有代码。想象一下,我有一个应用程序,其中有一个完整的用户注册,注册后,一个帐户被登录。让它成为一个运动鞋商店。因此,这里是所有产品的列表(RecyclerView),用户可以将一些产品添加到他的收藏夹中。问题是如何确保每个注册用户都有自己的收藏夹列表,这样他自然不会看到别人的收藏夹列表。我对如何通过 Firebase 或 ROOM 数据库完成此操作很感兴趣。
如果缩短问题,听起来可能像这样:如何根据特定用户显示内容
这可能是一个 many-many 关系,所以在房间里你会有一个 table 的用户,一个 table 的可以收藏的项目,然后是table 映射 user/favourite 组合。这个 table 通常只会存储两个 references/relationships/maps/associations ... 一个给用户,另一个给收藏夹。
这样一个项目可以被许多用户收藏,一个用户可以有任何收藏。您将使用 SELECT 查询提取用户收藏夹列表,该查询具有对用户的引用的 WHERE 子句。
作为使用 Room 的工作示例:-
用户table(房间里的实体):-
@Entity
data class User(
@PrimaryKey
val userId: Long? = null,
val username: String,
val userPassword: String
)
项目table/entity:-
@Entity
data class Item(
@PrimaryKey
val itemId: Long? = null,
val itemName: String
)
mapping/relationship/associative .... table UserItemFavourite :-
@Entity(
primaryKeys = ["userIdMap","itemIdMap"],
/* Foreign Keys enforce referential integrity */
foreignKeys = [
ForeignKey(entity = User::class, parentColumns = ["userId"],childColumns = ["userIdMap"], onDelete = CASCADE, onUpdate = CASCADE),
ForeignKey(entity = Item::class, parentColumns = ["itemId"],childColumns = ["itemIdMap"], onDelete = CASCADE, onUpdate = CASCADE)
],
indices = [Index("itemIdMap")]
)
data class UserItemFavourite(
val userIdMap: Long,
val itemIdMap: Long
)
一个 POJO(非实体),用于让用户获得最喜欢的项目列表 UserWithFavouriteItems :-
data class UserWithFavouriteItems (
@Embedded
val user: User,
@Relation(
entity = Item::class,
parentColumn = "userId",
entityColumn = "itemId" ,
associateBy = Junction(
value = UserItemFavourite::class,
parentColumn = "userIdMap",
entityColumn = "itemIdMap"
)
)
val itemList: List<Item>
)
另一个用于获取项目计数的 POJO(奖励)是最喜欢的:-
data class FavouriteItems(
@Embedded
val item: Item,
val favouredcount: Long
)
一些Dao的(数据库交互函数)AllDao》-
@Dao
abstract class AllDao {
@Insert
abstract fun insert(user: User): Long
@Insert
abstract fun insert(item: Item): Long
@Insert
abstract fun insert(userItemFavourite: UserItemFavourite): Long
@Query("SELECT coalesce(userid,-1) FROM user WHERE username=:userName AND userPassword=:password")
abstract fun login(userName: String, password: String): Long
@Query("SELECT * FROM user")
abstract fun getAllusers(): List<User>
@Query("SELECT * from user WHERE userid=:userId")
abstract fun getUserWithFavouriteItems(userId: Long): UserWithFavouriteItems
@Query("SELECT item.*, (SELECT count(*) FROM useritemfavourite WHERE itemIdMap = itemid) AS favouredcount FROM item ORDER BY favouredcount DESC")
abstract fun getFavouriteItemsList(): List<FavouriteItems>
@Query("SELECT (SELECT count(*) FROM user) + (SELECT count(*) FROM item) > 0")
abstract fun isData(): Boolean
}
数据库 (@Database) class(告诉数据库它是实体,并允许通过数据库实例获取 dao(s) 的实例)这个还包括获取数据库:-
@Database(entities = [User::class,Item::class,UserItemFavourite::class],version = 1)
abstract class TheDatabase: RoomDatabase() {
abstract fun getAllDao(): AllDao
companion object {
var instance: TheDatabase? = null
fun getInstance(context: Context): TheDatabase {
if (instance == null) {
instance = Room.databaseBuilder(
context,
TheDatabase::class.java,
"thedb.db"
)
.allowMainThreadQueries()
.build()
}
return instance as TheDatabase
}
}
}
- for convenience/brevity demo 可以在主线程运行
最后把它们放在一起 Activity :-
class MainActivity : AppCompatActivity() {
lateinit var db: TheDatabase
lateinit var dao: AllDao
val TAG = "USERINFO"
var currentUserid: Long = -1L;
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
db = TheDatabase.getInstance(this)
dao = db.getAllDao()
val passwordAttempts = listOf<String>("notpasswordsarah","passwordsrahnot","passwordsarah")
addSomeData()
for(s: String in passwordAttempts) {
if (login("sarah",s)) break
}
val currentUserWithFavourites = dao.getUserWithFavouriteItems(currentUserid)
Log.d(TAG,"User logged in is ${currentUserWithFavourites.user.username}. Favourites are :-")
for (i: Item in currentUserWithFavourites.itemList) {
Log.d(TAG,"\tFavourite Item is ${i.itemName}")
}
val favouriteItems = dao.getFavouriteItemsList()
for (fi in favouriteItems) {
Log.d(TAG,"Item is ${fi.item.itemName} favourite count is ${fi.favouredcount}")
}
}
private fun addSomeData() {
val test = dao.isData()
if (!dao.isData()) {
val u1 = dao.insert(User(username = "Fred",userPassword = "passwordfred"))
val u2 = dao.insert(User(username = "mary",userPassword = "passwordmary"))
val u3 = dao.insert(User(username = "sarah",userPassword = "passwordsarah"))
val i1 = dao.insert(Item(itemName = "Book"))
val i2 = dao.insert(Item(itemName = "Diary"))
val i3 =dao.insert(Item(itemName = "Pad"))
val i4 = dao.insert(Item(itemName = "Pencil"))
val i5 = dao.insert(Item(itemName = "Pen"))
val i6 = dao.insert(Item(itemName = "Highlighter"))
val i7 = dao.insert(Item(itemName = "Ruler"))
val i8 = dao.insert(Item(itemName = "Compass"))
dao.insert(UserItemFavourite(userIdMap = u1, itemIdMap = i1)) /* Fred has Book */
dao.insert(UserItemFavourite(userIdMap = u1, itemIdMap = i5)) /* Fred has Pen */
dao.insert(UserItemFavourite(userIdMap = u1, itemIdMap = i7)) /* Fred has Ruler */
dao.insert(UserItemFavourite(userIdMap = u3, itemIdMap = i2)) /* Sarah has Diary */
dao.insert(UserItemFavourite(userIdMap = u3,i7)) /* Sarah has Ruler */
}
}
private fun login(username: String, password: String): Boolean {
currentUserid = dao.login(username,password)
if (currentUserid > 0 ) {
Log.d(TAG,"Successfully Logged In.")
} else {
Log.d(TAG,"Login unsuccessful.")
}
return currentUserid > 0
}
}
结果输出到日志:-
2021-07-19 13:56:09.820 D/USERINFO: Login unsuccessful.
2021-07-19 13:56:09.821 D/USERINFO: Login unsuccessful.
2021-07-19 13:56:09.822 D/USERINFO: Successfully Logged In.
2021-07-19 13:56:09.828 D/USERINFO: User logged in is sarah. Favourites are :-
2021-07-19 13:56:09.828 D/USERINFO: Favourite Item is Diary
2021-07-19 13:56:09.828 D/USERINFO: Favourite Item is Ruler
2021-07-19 13:56:09.830 D/USERINFO: Item is Ruler favourite count is 2
2021-07-19 13:56:09.830 D/USERINFO: Item is Book favourite count is 1
2021-07-19 13:56:09.830 D/USERINFO: Item is Diary favourite count is 1
2021-07-19 13:56:09.830 D/USERINFO: Item is Pen favourite count is 1
2021-07-19 13:56:09.830 D/USERINFO: Item is Pad favourite count is 0
2021-07-19 13:56:09.830 D/USERINFO: Item is Pencil favourite count is 0
2021-07-19 13:56:09.830 D/USERINFO: Item is Highlighter favourite count is 0
2021-07-19 13:56:09.831 D/USERINFO: Item is Compass favourite count is 0
重要 上面的代码只是为了演示,因此简洁并且缺少某些方面(不应该)接受table 对于已发布的应用程序。