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
Sqlite 如何创建光标的可观察对象_Sqlite_Rx Java_Rx Android - Fatal编程技术网

Sqlite 如何创建光标的可观察对象

Sqlite 如何创建光标的可观察对象,sqlite,rx-java,rx-android,Sqlite,Rx Java,Rx Android,我有一个SQLite查询返回的游标,我想知道创建一个可观察的游标的正确方法 我创建了如下可观察的游标,请检查是否正确: Observable<Cursor> cursorObservable = Observable.create(new ObservableOnSubscribe<Cursor>() { @Override public void subscribe(ObservableEmitter<Cursor

我有一个SQLite查询返回的游标,我想知道创建一个可观察的游标的正确方法

我创建了如下可观察的游标,请检查是否正确:

 Observable<Cursor> cursorObservable = Observable.create(new ObservableOnSubscribe<Cursor>() {
            @Override
            public void subscribe(ObservableEmitter<Cursor> e) throws Exception {
                SQLDbHelper dbHelper = SQLDbHelper.getInstance(ctx);
                SQLiteDatabase db = dbHelper.getReadableDatabase();
                Cursor cursor = db.rawQuery("select * from " + MoviesContract.MovieEntry.TABLE_NAME, null);
                if (cursor != null) {
                    try {
                        while (cursor.moveToNext() && !e.isDisposed()) {
                            e.onNext(cursor);
                        }
                    } catch (Exception exception) {
                        e.onError(exception);
                    } finally {
                        cursor.close();
                    }

                }
                if (!e.isDisposed()) {
                    e.onComplete();
                }
            }
        });
Observable cursorObservable=Observable.create(newobservableOnSubscribe()){
@凌驾
public void subscribe(observeiemitter e)引发异常{
SQLDbHelper-dbHelper=SQLDbHelper.getInstance(ctx);
SQLiteDatabase db=dbHelper.getReadableDatabase();
Cursor Cursor=db.rawQuery(“选择*自”+MoviesContract.MovieEntry.TABLE_NAME,null);
如果(光标!=null){
试一试{
while(cursor.moveToNext()&&!e.isDisposed()){
e、 onNext(光标);
}
}捕获(异常){
e、 onError(例外情况);
}最后{
cursor.close();
}
}
如果(!e.isDisposed()){
e、 onComplete();
}
}
});

我感谢您将行包装成一个映射并通过流传递,比传递光标本身效果更好

class SimpleTest {
    @Test
    fun testCursorStream() {
        val cursor = fakeCursor()
        val stream = getCursorStream(cursor)

        stream.subscribe {
            Log.d("Test", it.entries.toString())
        }
    }

    private fun fakeCursor() : Cursor {
        val columns = arrayOf("id", "name", "age")
        val cursor = MatrixCursor(columns)
        val row1 = arrayOf(1, "Rodrigo", 26L)
        val row2 = arrayOf(2, "Lucas", 23L)
        val row3 = arrayOf(3, "Alan", 26L)
        cursor.addRow(row1)
        cursor.addRow(row2)
        cursor.addRow(row3)
        return cursor
    }

    private fun getCursorStream(cursor: Cursor) : Observable<Map<String, Any?>> {
        return Observable.create<Map<String, Any?>> {
            try {
                if (!cursor.moveToFirst()) {
                    it.onCompleted()
                    return@create
                }

                val row = HashMap<String, Any?>()

                do {
                    val lastColumnIndex = cursor.columnCount - 1

                    for (index in 0..lastColumnIndex) {
                        val name = cursor.getColumnName(index)
                        val type = cursor.getType(index)

                        when (type) {
                            Cursor.FIELD_TYPE_STRING -> row.put(name, cursor.getString(index))
                            Cursor.FIELD_TYPE_BLOB -> row.put(name, cursor.getBlob(index))
                            Cursor.FIELD_TYPE_FLOAT -> row.put(name, cursor.getFloat(index))
                            Cursor.FIELD_TYPE_INTEGER -> row.put(name, cursor.getInt(index))
                            Cursor.FIELD_TYPE_NULL -> row.put(name, null)
                        }
                    }

                    it.onNext(row)
                } while (cursor.moveToNext())

                it.onCompleted()
            } catch (e: Exception) {
                it.onError(e)
            }
        }
    }
}
类SimpleTest{
@试验
有趣的testCursorStream(){
val cursor=fakeCursor()
val stream=getCursorStream(游标)
stream.subscribe{
Log.d(“Test”,it.entries.toString())
}
}
private fun fakeCursor():Cursor{
val列=数组(“id”、“名称”、“年龄”)
val cursor=MatrixCursor(列)
val row1=阵列(1,“Rodrigo”,26L)
val row2=阵列(2,“Lucas”,23L)
val row3=阵列(3,“Alan”,26L)
cursor.addRow(第1行)
cursor.addRow(第2行)
cursor.addRow(第3行)
返回光标
}
private fun getCursorStream(光标:光标):可观察{
返回可观察的。创建{
试一试{
如果(!cursor.moveToFirst()){
it.onCompleted()
return@create
}
val行=HashMap()
做{
val lastColumnIndex=cursor.columnCount-1
for(0..lastColumnIndex中的索引){
val name=cursor.getColumnName(索引)
val type=cursor.getType(索引)
何时(输入){
Cursor.FIELD\u TYPE\u STRING->row.put(名称、Cursor.getString(索引))
Cursor.FIELD\u TYPE\u BLOB->row.put(名称、Cursor.getBlob(索引))
Cursor.FIELD\u TYPE\u FLOAT->row.put(名称、Cursor.getFloat(索引))
Cursor.FIELD\u TYPE\u INTEGER->row.put(名称、Cursor.getInt(索引))
Cursor.FIELD\u TYPE\u NULL->row.put(name,NULL)
}
}
it.onNext(世界其他地区)
}while(cursor.moveToNext())
it.onCompleted()
}捕获(e:例外){
it.onError(e)
}
}
}
}

希望有帮助。

请详细说明“每行”是什么意思?请给出常规android代码的示例尝试使用此库,或者看看它们是如何使用的sqlite@yosrizSQLite查询返回的游标包含指向行的指针,所以我想要一个可观察的对象,它一行接一行地发出这些行,直到游标用尽为止。您好@BharatMukkala!你能看看我的答案,看看它是否适合你吗?@RodrigoHenriques我会让你知道一旦我测试它。。。可能本周实际返回的光标在observable中没有工作。我没有返回游标,而是像您一样处理游标并返回贴图对象,效果很好。thanks@BharatMukkala一旦我的答案对你有效,你能检查一下我的答案是不是最好的吗?在你的循环
while(cursor.moveToNext())
中,你还需要检查订阅是否还没有被处理。否则,您可能会不必要地循环。