【问题标题】:Firebase database storing into sqlite database with some properties unchangedFirebase 数据库存储到 sqlite 数据库中,某些属性未更改
【发布时间】:2018-11-29 19:14:23
【问题描述】:

好的,所以我的应用数据库完全存储在 firebase 上, 我的应用每天都会更新它的数据库。

我在更新数据时每次都遵循什么程序:

  1. 删除当前的 sqlite 表
  2. 再次创建表
  3. 填写资料

这曾经完美地工作,想象一行被删除,所以当我删除整个表并重写整个事情时,被删除的行也从本地 sqlite 技术上删除,但现在表中有轻微的变化,有一列,比如说“viewed”,它存储是否查看特定行数据,“true”或“false”(字符串)

现在如果我在更新时删除数据,它将丢失此列属性。 然后我想在 sqlite 中使用 UPDATE 并更新每行列的数据,但是可能会有特定列不再存在于 firebase 中的情况,但如果我这样做,它将保留在我的本地数据库中。 (我的意思是数据没有被编辑而是被删除)。那么我该如何克服呢?

旧表:

db.execSQL("CREATE TABLE IF NOT EXISTS appdata_videos (id TEXT, link TEXT, title TEXT, subcode TEXT)");

新表:

db.execSQL("CREATE TABLE IF NOT EXISTS appdata_videos (id TEXT, link TEXT, title TEXT, subcode TEXT, viewed TEXT)");

附:我正在使用 firebase 单次监听器,因为我每天只需要更新一次数据。

我以前每次想清空数据库时都会运行这个函数:

public void clearDB()
    {
        db.execSQL("DROP TABLE IF EXISTS subCodes");
        db.execSQL("CREATE TABLE IF NOT EXISTS subCodes (id TEXT, dbName TEXT, subName TEXT, tagline TEXT, pref INTEGER, hasInterviewQuestions TEXT, hasVideos TEXT, hasCodes TEXT)");
        db.execSQL("DROP TABLE IF EXISTS appdata_codes");
        db.execSQL("CREATE TABLE IF NOT EXISTS appdata_codes (id TEXT, question TEXT, code TEXT, tag TEXT, subcode TEXT, imglink TEXT, xlink TEXT)");
        db.execSQL("DROP TABLE IF EXISTS appdata_videos");
        db.execSQL("CREATE TABLE IF NOT EXISTS appdata_videos (id TEXT, link TEXT, title TEXT, subcode TEXT)");
        db.execSQL("DROP TABLE IF EXISTS appdata_interviewquestions");
        db.execSQL("CREATE TABLE IF NOT EXISTS appdata_interviewquestions (id TEXT, subcode TEXT, html TEXT)");
    }

【问题讨论】:

  • 当你删除并创建一个新表时,你首先不会有多余的数据
  • 但现在我正在更改表格列.. 我有一个新列,其数据应该被包含
  • 不要删除表,更新表然后删除任何未更新的行。
  • 我该怎么做

标签: android sqlite firebase-realtime-database


【解决方案1】:

希望此解决方案对您有所帮助,

step1:在新表中添加新列日期

db.execSQL("CREATE TABLE IF NOT EXISTS appdata_videos (id TEXT, link TEXT, title TEXT, subcode TEXT, viewed TEXT, date TEXT)");

第二步:从 firebase 获取 ids 并检查 ids 是否存在于本地数据库中(遍历所有 ids) 示例:

if(isTheIdAvailableInLocalTable(idFromFirebase)){
//update the date column to todays date (dd-MM-yyyy)
}else{
//new entry so insert into local table with todays date (dd-MM-yyyy)
}

Step3:从本地表中删除日期不等于tadays日期的地方。

【讨论】:

  • 这是一个很棒的解决方案。非常感谢。现在只帮我做一件事。如何管理日期?我应该使用哪个课程以及如何比较两个日期
  • 日期 date = new Date(); SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy"); String strDate= formatter.format(date);
  • 比较字符串"strDate.equals("30-11-2018")";
  • 这看起来不错,但不建议在数据库操作中依赖日期。如果您的用户设备以某种方式更改了日期...一个故障重置一个我不知道的恶作剧...这将失败。使用 id 而不是日期是安全的。如果 id 存在则更新行,否则删除它们。
  • 让我分解一个逻辑失败的场景。假设您有两行日期为03-12-18 => a 和03-12-18 =>b,所以明天有新数据进来,但设备日期没有改变。说项目b 在当天被删除,项目a 现在是aa。根据您的逻辑,a 将更新为aa,但b 不会被删除,因为第 3 步将失败。所以旧数据仍然存在。不太可能发生,但有可能。只是一个预防措施,否则你的逻辑是好的@bk7。抱歉,我说使用 uuid 我的意思是使用项目 ID key 而不是日期。
猜你喜欢
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
相关资源
最近更新 更多