我的应用程序将离线数据存储在sqlite中,然后根据用户选择将其同步到在线服务器。我需要sqlite中每行的唯一ID,以便在我同步/更新时,我可以管理每行的状态和其他内容。
使用我的应用,所有设备的唯一ID都应该是唯一的。我试过 System.currentTimeMillis()的选项,但它似乎可以跨设备重复。我搜索的其他选项是 UUID 或合并2个值,例如 System.currentTimeMillis()和 Random.nextLong()以创建唯一值
这样做的最佳和最可靠的方法是什么?
答案 0 :(得分:6)
你的UUID是对的。 UUID表示Universally Unique IDentifier,它专门为您拥有的分布式计算环境而设计,多个设备生成唯一记录。因此,它“实际上是独一无二的”。这正是它所说的 - 实际上,它在所有设备和时间上都是独一无二的。大多数实现采用某种形式的设备ID(例如实际上唯一的MAC地址),以及时间元素和加密的位置信息(地理IP或类似的)。
在Java / Android中,您可以使用UUID.randomUUID().toString()
为SQLite数据库生成唯一的主键。一旦您同步回服务器,这些主键实际上将是唯一的。
我建议不要尝试实现自己的UUID方案(基于AndroidID,MAC地址,IMEI,系统时间等)。虽然您可能获得轻微的存储优势,但开发和故障排除(恕我直言)的努力是不值得的。
答案 1 :(得分:0)
你有关于UUID哈希码+ System.currentTimeMillis(),哈希码可以复制,但它有32位大小,所以几乎不可能。如果添加System.currentTimeMillis(),则最小化sameId的可能性。
如果每台设备需要一条记录,那么您可以使用UUID,但是......考虑到UUID有时可能为空,并且您还需要添加其他权限才能获得它。在这种情况下,最可靠的将是:System.currentTimeMillis()+ Random.nextLong()。
这取决于记录编号,如果你想拥有10 000 - 100 000个唯一记录,而不是选择上面的一种方法,你就可以了。如果你正在寻找比检查UUID,Imei,Sim序列号更大的东西。
这是一个很好的androidId,对于设备来说是唯一的,但要注意,它有时可能为null,这就是为什么我建议使用System.currentTimeMillis()。 import android.provider.Settings.Secure;
private String android_id = Secure.getString(getContext()。getContentResolver(), Secure.ANDROID_ID);
答案 2 :(得分:-1)
为什么不尝试UUID和System.currentTimeMillis()的组合(甚至简单追加)? 这将始终是唯一的(假设UUID不为空)