标签: sqlbrite

使用SqlBrite/SqlDelight(脱机数据库)和Retrofit(Http请求)的存储库模式

我正在使用SqlBrite/SqlDelight在RxJava中实现存储库模式以进行脱机数据存储并为Http请求进行改造

这是一个样本:

protected Observable<List<Item>> getItemsFromDb() {
     return database.createQuery(tableName(), selectAllStatement())
             .mapToList(cursor -> selectAllMapper().map(cursor));
 }


public Observable<List<Item>>getItems(){
     Observable<List<Item>> server = getRequest()
                 .doOnNext(items -> {
                     BriteDatabase.Transaction transaction = database.newTransaction();
                     for (Item item : items){
                         database.insert(tableName(), contentValues(item));
                     }
                     transaction.markSuccessful();
                     transaction.end();
                 })
                 .flatMap(items -> getItemsFromDbById())
                 .delaySubscription(200, TimeUnit.MILLISECONDS);
         Observable<List<Item>> db = getItemsFromDbById(id)
                 .filter(items -> items != null && items.size() > 0);
     return Observable.amb(db, server).doOnSubscribe(() -> server.subscribe(items -> {}, throwable -> {}));
 }
Run Code Online (Sandbox Code Playgroud)

当前实现用于Observable.amb获取最新的2个流并返回db流,以防万一db有数据或服务器.为了防止在没有互联网的情况下早期失败,server有一个delaySubscription上面的200ms.

我尝试使用, …

android rx-java retrofit sqlbrite sqldelight

12
推荐指数
1
解决办法
543
查看次数

可以从Android SQLiteConstraintException获取特定的错误详细信息?

我对某些数据收到以下错误,概念足够清晰:

android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 787)

但是,这并没有帮助我找到哪个特定记录具有无效的FK.有没有办法打开我的代码并尝试用新事务隔离每个插入,有没有办法打开(或提取)日志记录,使用有用的详细信息,例如有问题的表,甚至导致问题的FK值?

此外,我正在使用SqlBrite,并已启用调试日志记录(只记录操作,我仍然没有获得有关错误的更多信息)

更新: 这是我自己的代码上面的所有logcat; 本质上是在尝试关闭先前打开的事务(BriteDatabase.Transaction)时捕获的异常(BriteDatabase.Transaction对象是一个新的添加;我只是从SqlBrite 0.1.0迁移到0.4.1).

android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 787)
    at android.database.sqlite.SQLiteConnection.nativeExecute(Native Method)
    at android.database.sqlite.SQLiteConnection.execute(SQLiteConnection.java:555)
    at android.database.sqlite.SQLiteSession.endTransactionUnchecked(SQLiteSession.java:437)
    at android.database.sqlite.SQLiteSession.endTransaction(SQLiteSession.java:401)
    at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:522)
    at com.squareup.sqlbrite.BriteDatabase$1.end(BriteDatabase.java:85)
Run Code Online (Sandbox Code Playgroud)

sqlite android sqlbrite

8
推荐指数
1
解决办法
1597
查看次数

RxJava和Sqlbrite - 要使用的运算符

我开始将RxJava与SqlBrite结合使用,我遇到了zip运算符的一些问题.

假设我有2个课程,User并且Tweet.

public class User {
    public long id;
    public List<Tweet> users;
    ...
}

public class Tweet {
    public long id;
    public User poster;
    ...
}
Run Code Online (Sandbox Code Playgroud)

和他们各自的SQLite表:

user
---------
id INTEGER PRIMARY KEY

tweet
---------
id INTEGER PRIMARY KEY
poster_id INTEGER
FOREIGN KEY(poster_id) REFERENCES user(id)
Run Code Online (Sandbox Code Playgroud)

和他们各自的SqlBrite DAO

userDAO的:

public class UserDao {
    private final BriteDatabase briteDb;
    private final TweetDAO tweetDao;

    ...

    public Observable<List<User>> getUsersWithTheirTweets() {
        Observable<User> usersObs = briteDb.createQuery("user", "SELECT * FROM …
Run Code Online (Sandbox Code Playgroud)

java android rx-java sqlbrite

6
推荐指数
1
解决办法
2221
查看次数

带有两个ArrayLists的Android ListView适配器

在我们的聊天应用程序中,我们希望使用很酷的新库SQLBrite来更新数据库更改的聊天.由于我们的聊天有无尽的滚动,聊天室可以有非常大的消息列表,我们希望将提供给Chat ListView适配器的ArrayList拆分为两个列表.检查图形的想法. 在此输入图像描述

  1. 我们想在数据库中设置一个点,通过正常的SQLite查询查询旧消息.在这一点之下,我们想要设置SQLBrite,这将为我们带来添加到数据库的新鲜消息.
  2. 每个部分都应填充其对应的ArrayList.两个arrayLists应该组合在一个适配器中.

我的问题是可以吗?如果是,我们如何在单个适配器中组合和处理两个动态ArrayLists?

编辑1 1.我需要在重置期间保持聊天滚动位置,并且在ArrayLists更新期间不会闪烁.

android listview adapter sqlbrite

5
推荐指数
1
解决办法
4863
查看次数

使用SQLBrite + Retrofit刷新数据

这是我的用例:

我正在开发一个通过REST API与服务器通信的应用程序,并将接收到的数据存储在SQLite数据库中(它将其用作某些类型的缓存).

当用户打开屏幕时,必须进行以下操作:

  1. 如果可用,数据将从DB加载.
  2. 该应用程序调用API来刷新数据.
  3. API调用的结果将持久保存到DB.
  4. 截获数据更改通知时,将从数据库重新加载数据.

这与此处介绍的情况非常相似,但略有不同.

由于我使用的SQLBrite,数据库可观不会终止(因为有一个ContentObserver注册了,是推动新的数据往下流),所以类似的方法concat,merge等将无法正常工作.

目前,我已使用以下方法解决了这个问题:

Observable.create(subscriber -> {
    dbObservable.subscribe(subscriber);
    apiObservable
        .subscribeOn(Schedulers.io())
        .observeOn(Schedulers.io())
        .subscribe(
            (data) -> {
                try {
                    persistData(data);
                } catch (Throwable t) {
                    Exceptions.throwOrReport(t, subscriber);
                }
            },

            (throwable) -> {
                Exceptions.throwOrReport(throwable, subscriber);
            })
})
Run Code Online (Sandbox Code Playgroud)

它似乎工作正常,但它似乎并不优雅和"正确".

你能否建议或指出一个资源,解释什么是处理这种情况的最佳方法?

android rx-java sqlbrite retrofit2

3
推荐指数
1
解决办法
531
查看次数