如何根据特定用户 kotlin 显示内容

时间:2021-07-18 20:59:58

标签: android firebase kotlin android-recyclerview android-room

本题不会有代码。想象一下,我有一个应用程序,其中有一个完整的用户注册,注册后,登录一个帐户。让它成为一个运动鞋商店。所以,这里是所有产品的列表(RecyclerView),用户可以将一些产品添加到他的收藏夹中。问题是如何确保每个注册用户都有自己的收藏夹列表,这样他自然不会看到别人的。我对如何通过 Firebase 或 ROOM 数据库完成此操作很感兴趣。

如果你缩短问题,它可能听起来像这样:如何根据特定用户显示内容

1 个答案:

答案 0 :(得分:1)

这可能是一个多对多的关系,所以在房间里你会有一个用户表,一个可以收藏的项目表,然后是一个映射用户/最喜欢组合的表。这个表通常只存储两个引用/关系/地图/关联......一个给用户,另一个给收藏。

这样的项目可以被许多用户收藏,并且用户可以有任何收藏。您将使用具有用户引用的 WHERE 子句的 SELECT 查询提取用户收藏夹列表。

作为使用 Room 的工作示例:-

用户表(房间中的实体):-

@Entity
data class User(
    @PrimaryKey
    val userId: Long? = null,
    val username: String,
    val userPassword: String
)

Item 表/实体:-

@Entity
data class Item(
    @PrimaryKey
    val itemId: Long? = null,
    val itemName: String
)

映射/关系/关联 .... 表 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 (@Database) 类(告诉数据库它是实体并允许通过数据库实例获取 dao 的实例)这个类还包括获取数据库的实例:-

@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
        }
    }
}
  • 为了方便/简洁,可以在主线程上运行演示

最后将它们放在一个活动中:-

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

重要以上代码仅用于演示,因此简洁且缺少某些方面(应该)对于已发布的应用是不可接受的。

相关问题