Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 文件室-插入或替换,但保留数据库字段?_Android_Sqlite_Android Sqlite_Android Room - Fatal编程技术网

Android 文件室-插入或替换,但保留数据库字段?

Android 文件室-插入或替换,但保留数据库字段?,android,sqlite,android-sqlite,android-room,Android,Sqlite,Android Sqlite,Android Room,我的本地数据库中有一个名为event的表,其中包含以下字段: id(主键) 名称(文本) 日期(时间) 收藏夹(整数、0或1) 服务器会给我一个事件列表,没有收藏夹字段,收藏夹字段只是本地的 我正在使用此代码插入事件 @Insert(onConflict = OnConflictStrategy.REPLACE) void insertEvents(List<Event> events); @Insert(onConflict=OnConflictStrategy.REPLAC

我的本地数据库中有一个名为event的表,其中包含以下字段:

  • id(主键)
  • 名称(文本)
  • 日期(时间)
  • 收藏夹(整数、0或1)
服务器会给我一个事件列表,没有收藏夹字段,收藏夹字段只是本地的

我正在使用此代码插入事件

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertEvents(List<Event> events);
@Insert(onConflict=OnConflictStrategy.REPLACE)
无效插入事件(列出事件);
问题是,如果一个事件已经存储在本地数据库中,它将丢失favorite属性,并且在插入和替换之后它将始终为false


有没有一种方法可以像这样批量插入,但保留最喜欢的字段?

我也遇到了同样的问题,这就是我如何解决这个问题的场景

  • 检查数据库中是否有喜爱的项目,并获取它们
  • 从API获取数据
  • 将所有数据插入数据库
  • 使用以前提取的标记为收藏夹的项目更新数据库

    • 我也遇到过同样的情况。我就是这样解决的。 由于来自服务器的数据是不可变的,并且会重置本地值,因此我决定为来自服务器的数据保留一个表,为“本地”数据保留另一个表

      远程数据的表
      ServerData

      ServerDataAttrs
      仅用于本地数据

      ServerDataAttrs
      包含所有本地列以及表
      ServerData
      中的主键
      id

      ServerData.id == ServerDataAttrs.id
      
      通过这种方式,
      ServerDataAttrs
      中的每一行都与
      ServerData
      中的对应行相关(不需要另一种方式,这就是我稍后使用
      左联接的原因)。您始终可以替换
      ServerData
      上的数据,而
      ServerDataAttrs
      中的本地数据将保持不变

      我没有设置外键以避免意外删除。只有在从其
      DAO
      调用delete方法时,我才删除了本地数据

      要查询数据,可以创建一个包含所有远程值和本地值的
      POJO

      public class ServerDataWithAttrsPojo {
         private long id;
         private String name;
         ...
         private int favorite;
      
         // public constructor, getters and setters...
      }
      
      然后,查询必须是两个表之间的
      联接

      SELECT sd.id, sd.name, ...., sda.favorite
      FROM ServerData sd LEFT JOIN ServerDataAttrs sda ON sd.id = sda.id
      

      我使用
      LEFT JOIN
      ,以防
      ServerData
      中的实体在
      ServerDataAttrs
      中没有我前面提到的行。

      我认为您不能使用此批量插入来共享插入事件(列表事件)的代码method@UdayRamjiyani就是,,是Dao的抽象方法吗?我遇到了同样的问题,你找到解决方法了吗?@jl没有,目前没有解决方法:(