UUID比使用行ID的别名更困难且效率更低。您只需使用 column_name INTEGER PRIMARY KEY
声明列,列就是行ID的别名。
当未提供值时,SQLite 会生成一个整数值。该值可以高达9223372036854775807(也可以使用负值,这样就有两倍的可能性)。
使用行ID可能快2倍。
您可以分配一个整数值。
云中的唯一性问题。如果应用程序没有指定值,则没有问题。
如果需要随机性,则如果未使用自动生成(在实体中仅使用Long而不是long的@PrimaryKey),则SQlite将生成唯一的随机值,并使用行ID 9223372036854775807(当达到此值时,SQLite会找到随机值)。
如果需要正负随机性,则除了添加带有9223372036854775807的行之外,还要添加负值。
以下是如何在Room中简单实现:
实体如下:
@Entity
public class RandomId {
@PrimaryKey
Long randomId;
String name;
public RandomId(){}
public Long getRandomId() {
return randomId;
}
public void setRandomId(Long randomId) {
this.randomId = randomId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
道力克
@Dao
public interface RandomIdDao {
@Insert
long insert(RandomId randomId);
@Query("SELECT * FROM randomid ORDER BY name")
List<RandomId> getAll();
}
@Database(version = 1,entities = {RandomId.class})
public abstract class RandomIdDatabase extends RoomDatabase {
abstract RandomIdDao randomIdDao();
}
类似活动
public class MainActivity extends AppCompatActivity {
RandomIdDatabase randomIdDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
randomIdDatabase = Room.databaseBuilder(this,RandomIdDatabase.class,"randomiddb")
.allowMainThreadQueries()
.addCallback(new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
ContentValues cv = new ContentValues();
cv.put("randomId",9223372036854775807L);
db.insert("RandomID", OnConflictStrategy.IGNORE,cv);
cv.clear();
cv.put("RandomId",-9223372036854775808L);
db.insert("RandomID", OnConflictStrategy.IGNORE,cv);
}
})
.build();
randomIdDatabase.getOpenHelper().getWritableDatabase().beginTransaction();
RandomId r = new RandomId();
for (int i = 0; i < 1000; i++) {
r.setRandomId(null);
r.setName("name" + String.valueOf(i));
randomIdDatabase.randomIdDao().insert(r);
}
randomIdDatabase.getOpenHelper().getWritableDatabase().setTransactionSuccessful();
randomIdDatabase.getOpenHelper().getWritableDatabase().endTransaction();
List<RandomId> randomIds = randomIdDatabase.randomIdDao().getAll();
for (RandomId randomId : randomIds) {
Log.d("IDDATA","name is " + randomId.getName() + " ID is " + randomId.getRandomId());
}
}
}
运行如此顺畅
D/IDDATA: name is null ID is -9223372036854775808
D/IDDATA: name is null ID is 9223372036854775807
D/IDDATA: name is name0 ID is 4107292993476813590
D/IDDATA: name is name1 ID is 22838362508669948
D/IDDATA: name is name10 ID is 3903077096050951194
D/IDDATA: name is name100 ID is 948211817704090341
D/IDDATA: name is name101 ID is 806075887185875254
D/IDDATA: name is name102 ID is 3204631877439831564
D/IDDATA: name is name103 ID is 1003770814770374644
D/IDDATA: name is name104 ID is 4116052162843098839
D/IDDATA: name is name105 ID is 3379736427023998848
D/IDDATA: name is name106 ID is 3597159533635558763
D/IDDATA: name is name107 ID is 3199952401843656135
D/IDDATA: name is name108 ID is 474496762820166420
D/IDDATA: name is name109 ID is 486041123921960369
D/IDDATA: name is name11 ID is 1162315037045732434
D/IDDATA: name is name110 ID is 2807178719405346105
D/IDDATA: name is name111 ID is 3643686187723794393
D/IDDATA: name is name112 ID is 4551641574908625814
D/IDDATA: name is name113 ID is 482870610003853013
D/IDDATA: name is name114 ID is 3865465837800377065
D/IDDATA: name is name115 ID is 2934767897308599664
D/IDDATA: name is name116 ID is 4473965121303816092
D/IDDATA: name is name117 ID is 2244323676217441072
D/IDDATA: name is name118 ID is 911318293674111436
D/IDDATA: name is name119 ID is 1434915280093930897
D/IDDATA: name is name12 ID is 2661856341619735016
........