我正在使用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.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) 我开始将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) 在我们的聊天应用程序中,我们希望使用很酷的新库SQLBrite来更新数据库更改的聊天.由于我们的聊天有无尽的滚动,聊天室可以有非常大的消息列表,我们希望将提供给Chat ListView适配器的ArrayList拆分为两个列表.检查图形的想法.

我的问题是可以吗?如果是,我们如何在单个适配器中组合和处理两个动态ArrayLists?
编辑1 1.我需要在重置期间保持聊天滚动位置,并且在ArrayLists更新期间不会闪烁.
这是我的用例:
我正在开发一个通过REST API与服务器通信的应用程序,并将接收到的数据存储在SQLite数据库中(它将其用作某些类型的缓存).
当用户打开屏幕时,必须进行以下操作:
这与此处介绍的情况非常相似,但略有不同.
由于我使用的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)
它似乎工作正常,但它似乎并不优雅和"正确".
你能否建议或指出一个资源,解释什么是处理这种情况的最佳方法?