androidcursor浅析
在Android开发中,常常需要对数据库进行操作。Android提供了一个SQLite数据库用于本地存储。如果要实现数据的增删改查,需要使用Android提供的SQLiteOpenHelper类,它封装了对SQLite数据库的操作,但是我们更多的时候会使用Cursor来获取数据库的内容。
什么是Cursor
打个比方,我们把它理解成一个游标,在数据库中以行为单位移动。每一行都有它的数据,而它所能取到的就是这一行的数据。Android中,Cursor是为了方便取出SQLite数据使开发者轻松处理数据的一个类。
它并不能增删改查数据库,它是查询后的一种封装类,可以方便地对查询结果进行遍历,从而取出其中的数据。
我们可以通过一个示例来了解一下。假设我们有一张Student表,其中有id, name, sex三个字段。现在我们可以使用以下代码来获取其中的数据:
Cursor cursor = db.query("Student", null, null,null, null, null, null);
while (cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String sex = cursor.getString(cursor.getColumnIndex("sex"));
//在这里对获取到的数据进行处理
}
上面的代码中,我们用db.query
方法查询了Student表中的所有数据,并将这些数据存储在Cursor中。接着,我们使用cursor.moveToNext()
遍历Cursor中的每一行,并使用cursor.getColumnIndex
方法获取当前行中的每一列的值。
Cursor有很多方法,这里文字中不加详细解释,大家可以通过搜索进一步了解。
Cursor的关闭
使用Cursor的时候,需要在查询完成后立即调用close()
方法,否则会造成内存泄漏。因为Cursor是占用系统资源的,可以理解为一种类似IO的操作。忘记关闭Cursor,会导致出现性能问题和内存不足的问题。
if (cursor != null) {
cursor.close();
}
在Fragment/Activity中使用Cursor
Cursor的一个典型用途是在Fragment/Activity中使用。在Fragment/Activity中查询数据库,可以使用Loader
来进行异步查询,加载数据,避免阻塞UI线程。
同时,当Fragment/Activity销毁的时候,需要调用LoaderManager
的destroyLoader()
方法来回收Loader,确保应用正常运行。
class MyFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getLoaderManager().initLoader(0,null,this);
}
@NonNull
@Override
public Loader<Cursor> onCreateLoader(int id, @Nullable Bundle args) {
CursorLoader loader = new CursorLoader(getActivity());
loader.setUri(uri);
return loader;
}
@Override
public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor data) {
// 在这里对获取到的数据进行处理
}
@Override
public void onLoaderReset(@NonNull Loader<Cursor> loader) {
// 数据重置操作
}
}
总结
Cursor是针对SQLite数据库的一种操作类。它是查询后的一种封装类,可以轻松地对数据进行遍历。使用Cursor的时候,需要在查询完成后立即进行关闭操作,避免内存泄漏。在Fragment/Activity中使用Cursor,可以使用Loader来避免主线程阻塞,并且在销毁时需要进行回收操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:androidcursor浅析 - Python技术站