【发布时间】:2018-07-18 13:10:12
【问题描述】:
这是我第一次尝试使用 Room 数据库,我想用 20 个用户对象预先填充数据库。但是我使用的代码每次运行时都会在现有列表中增加 20 个用户。如何防止它这样做?
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
private static AppDatabase INSTANCE;
public abstract DataExchange dataExchange();
public static AppDatabase getAppDatabase(final Context context){
if (INSTANCE == null){
INSTANCE = Room.databaseBuilder(context,
AppDatabase.class,
"User_Database")
.addCallback(new Callback() {
@Override
public void onCreate(@NonNull final SupportSQLiteDatabase db) {
super.onCreate(db);
Executors.newSingleThreadScheduledExecutor().execute(new Runnable() {
@Override
public void run() {
getAppDatabase(context).dataExchange().insert(User.populate());
}
});
}
})
.build();
}
return INSTANCE;
}
public static void destroyInstance(){
INSTANCE = null;
}
这是用户类:
@Entity(tableName = "user_table")
public class User{
public User(String name){
setName(name);
}
@PrimaryKey(autoGenerate = true)
private int uid;
@ColumnInfo(name = "Username")
private String name;
public String getName() {
return name;
}
public void setUid(int uid) {
this.uid = uid;
}
public void setName(String name) {
this.name = name;
}
public static User[] populate(){
User[] ar = new User[20];
for(int i=0; i<20;i++){
ar[i] = new User("USER "+(i+1));
}
return ar;
}
}
另外,我从中获取代码的地方有一个 getInstance(context) 而不是 run() 中的 getAppDatabase(context)。我更改了它,因为在我不知道的 5 个库中找到了 getInstance。
这里是数据交换:
@Dao
public interface DataExchange {
@Query("SELECT * FROM user_table")
List<User> getAll();
@Query("SELECT * FROM user_table where username LIKE :name ")
User findByName(String name);
@Query("SELECT COUNT(*) from user_table")
int countUsers();
@Update
void update(User user);
@Insert
void insertAll(User... users);
@Delete
void delete(User user);
}
【问题讨论】:
-
使用
@Entity和@Dao,在实体中应该有一个主键,每个用户都是唯一的 -
@Redman 每个用户都有一个 int 变量和一个 String 值。 int 变量是主键。
-
当应用程序被杀死并再次打开时,用户的int变量是否相同?
-
它应该保持不变。不会吗?这就是我使用数据库的原因。
-
再说一次,你为什么要对我们隐藏 User 类?里面有什么私密的东西不想让我们看到吗?
标签: java android sql android-room