RxJava2 Flowable SQLite Android 数据库访问实例攻略
在本攻略中,我们要通过一个 RxJava2 Flowable SQLite Android 数据库访问实例来展示如何在 Android Studio 中使用 RxJava2 和 SQLite 进行数据库操作,同时将数据库操作和页面事件机制相结合,通过 Flowable 实现数据的异步更新并展示到页面上。
前置要求
在开始之前,我们需要先了解以下知识:
- Java 语言基础
- Android Studio 的基本使用方法
- SQLite 数据库
Step 1: 导入依赖项
我们需要在项目的 build.gradle
文件中添加依赖项来使用 RxJava2 和 SQLite:
dependencies {
implementation "io.reactivex.rxjava2:rxjava:2.2.19"
implementation "io.reactivex.rxjava2:rxandroid:2.1.1" // 如果需要在 Android 中使用 RxJava2,添加此项
implementation "com.squareup.retrofit2:adapter-rxjava2:2.4.0" // 如果需要在 Retrofit2 中使用 RxJava2,添加此项
implementation "androidx.sqlite:sqlite:2.1.0" // SQLite 支持库
}
Step 2: 创建 SQLite 数据库
我们需要创建一个继承自 SQLiteOpenHelper
类的 DatabaseHelper
类来辅助进行数据库的管理。在 DatabaseHelper
类中,我们需要实现以下方法:
public class DatabaseHelper extends SQLiteOpenHelper {
// 数据库版本号
private static final int DATABASE_VERSION = 1;
// 数据库名
private static final String DATABASE_NAME = "my_database";
private static DatabaseHelper sInstance;
public static synchronized DatabaseHelper getInstance(Context context) {
if (sInstance == null) {
sInstance = new DatabaseHelper(context.getApplicationContext());
}
return sInstance;
}
private DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// 在数据库第一次创建时,初始化数据库
db.execSQL(User.CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 数据库版本升级时的操作
}
public List<User> getUsers() {
SQLiteDatabase db = this.getReadableDatabase();
List<User> userList = new ArrayList<>();
Cursor cursor = db.rawQuery(User.GET_ALL_USERS_QUERY, null);
if (cursor.moveToFirst()) {
do {
User user = new User();
user.setId(cursor.getInt(cursor.getColumnIndex(User.COLUMN_ID)));
user.setName(cursor.getString(cursor.getColumnIndex(User.COLUMN_NAME)));
user.setAge(cursor.getInt(cursor.getColumnIndex(User.COLUMN_AGE)));
userList.add(user);
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return userList;
}
public boolean insertUser(User user) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(User.COLUMN_NAME, user.getName());
values.put(User.COLUMN_AGE, user.getAge());
long id = db.insert(User.TABLE_NAME, null, values);
db.close();
return id != -1;
}
}
User
是一个实体类,用于封装用户信息,并提供了以下静态属性:
public class User {
public static final String TABLE_NAME = "users";
public static final String COLUMN_ID = "id";
public static final String COLUMN_NAME = "name";
public static final String COLUMN_AGE = "age";
public static final String CREATE_TABLE =
"CREATE TABLE " + TABLE_NAME + "("
+ COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ COLUMN_NAME + " TEXT,"
+ COLUMN_AGE + " INTEGER"
+ ")";
public static final String GET_ALL_USERS_QUERY = "SELECT * FROM " + TABLE_NAME;
// 其他操作语句
// ...
}
Step 3: 使用 RxJava2 和 SQLite 进行数据库访问
在 MainActivity
类中,我们需要实现以下步骤:
- 解析并展示用户列表
- 添加用户
- 数据库操作和页面更新结合
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private RecyclerView mRecyclerView;
private List<User> mUserList;
private UserAdapter mUserAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
}
private void initView() {
mRecyclerView = findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mUserList = new ArrayList<>();
mUserAdapter = new UserAdapter(R.layout.item_user, mUserList);
mRecyclerView.setAdapter(mUserAdapter);
}
private void initData() {
loadData();
}
private void loadData() {
// 第一步:创建 Flowable 对象
Flowable<List<User>> flowable = Flowable.create(new FlowableOnSubscribe<List<User>>() {
@Override
public void subscribe(FlowableEmitter<List<User>> e) throws Exception {
List<User> userList = DatabaseHelper.getInstance(MainActivity.this).getUsers();
e.onNext(userList);
e.onComplete();
}
}, BackpressureStrategy.BUFFER);
// 第二步:指定订阅者线程和观察者线程
flowable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new ResourceSubscriber<List<User>>() {
@Override
public void onNext(List<User> userList) {
mUserList.clear();
mUserList.addAll(userList);
mUserAdapter.notifyDataSetChanged();
}
@Override
public void onError(Throwable t) {
Log.e(TAG, "onError: Failed", t);
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete");
}
});
}
public void addUser(View view) {
// 第一步:创建 Flowable 对象
Flowable<Boolean> flowable = Flowable.create(new FlowableOnSubscribe<Boolean>() {
@Override
public void subscribe(FlowableEmitter<Boolean> e) throws Exception {
User user = new User();
user.setName("paul");
user.setAge(35);
boolean result = DatabaseHelper.getInstance(MainActivity.this).insertUser(user);
e.onNext(result);
e.onComplete();
}
}, BackpressureStrategy.BUFFER);
// 第二步:指定订阅者线程和观察者线程
flowable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new ResourceSubscriber<Boolean>() {
@Override
public void onNext(Boolean result) {
if (result) {
Toast.makeText(MainActivity.this, "添加成功", Toast.LENGTH_SHORT).show();
loadData();
} else {
Toast.makeText(MainActivity.this, "添加失败", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onError(Throwable t) {
Log.e(TAG, "onError: Failed", t);
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete");
}
});
}
}
Flowable.create()
方法会创建一个 Flowable 对象,我们需要在其中定义异步的数据库操作,并将数据通过 e.onNext()
方法传递给观察者。同时使用 BackpressureStrategy.BUFFER
来保证数据能够流畅地传输。
我们通过 Flowable.subscribeOn()
方法和 Flowable.observeOn()
方法来指定进行该操作的线程和数据更新的线程,其中 subscribeOn()
方法指定订阅者线程,observeOn()
方法指定观察者线程,我们在这里指定了订阅者线程为 Schedulers.io()
,即 IO 线程,观察者线程为 AndroidSchedulers.mainThread()
,即主线程。
最后,在实现 addUser()
方法时,我们首先在 Flowable 中进行用户添加操作,并通过 e.onNext()
来将结果传递给观察者,再异步更新页面。在更新页面时,由于 Flowable 已经被订阅了,所以我们不需要再额外开启子线程来更新界面。
示例
示例1:展示用户列表
在 MainActivity
的 onCreate()
方法中通过调用 loadData()
方法来展示用户列表。在 loadData()
方法中,我们使用了 Flowable.create()
方法创建一个 Flowable 对象,该对象在背景线程中使用 DatabaseHelper.getInstance(MainActivity.this).getUsers();
获取用户列表,并使用 e.onNext(userList);
将获取的数据传递给订阅者。获取成功后,在观察者中更新 UI。注意保证数据流的顺利连接所需的 BackpressureStrategy.BUFFER
,以及指定订阅者线程为 IO 线程以及观察者线程为主线程等必要步骤。具体代码如下:
private void loadData() {
// 第一步:创建Flowable对象
Flowable<List<User>> flowable = Flowable.create(new FlowableOnSubscribe<List<User>>() {
@Override
public void subscribe(FlowableEmitter<List<User>> e) throws Exception {
List<User> userList = DatabaseHelper.getInstance(MainActivity.this).getUsers();
e.onNext(userList);
e.onComplete();
}
}, BackpressureStrategy.BUFFER);
// 第二步:指定订阅者线程和观察者线程
flowable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new ResourceSubscriber<List<User>>() {
@Override
public void onNext(List<User> userList) {
mUserList.clear();
mUserList.addAll(userList);
mUserAdapter.notifyDataSetChanged();
}
@Override
public void onError(Throwable t) {
Log.e(TAG, "onError: Failed", t);
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete");
}
});
}
示例2:添加用户
在添加用户的事件处理函数 addUser()
中,我们首先创建一个 Flowable 对象,通过 Flowable.create()
方法创建,该对象在新线程中调用 DatabaseHelper.getInstance(MainActivity.this).insertUser(user);
写入用户。这里我们使用了 e.onNext(result);
方法将添加结果传递给订阅者。添加成功后,我们通过异步 loadData()
方法来更新列表。注意需要保证数据流程的相连契约所需的 BackpressureStrategy.BUFFER
,以及指定订阅者线程为 IO 线程以及观察者线程为主线程等必要步骤。具体代码如下:
public void addUser(View view) {
// 第一步:创建 Flowable 对象
Flowable<Boolean> flowable = Flowable.create(new FlowableOnSubscribe<Boolean>() {
@Override
public void subscribe(FlowableEmitter<Boolean> e) throws Exception {
User user = new User();
user.setName("paul");
user.setAge(35);
boolean result = DatabaseHelper.getInstance(MainActivity.this).insertUser(user);
e.onNext(result);
e.onComplete();
}
}, BackpressureStrategy.BUFFER);
// 第二步:指定订阅者线程和观察者线程
flowable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new ResourceSubscriber<Boolean>() {
@Override
public void onNext(Boolean result) {
if (result) {
Toast.makeText(MainActivity.this, "添加成功", Toast.LENGTH_SHORT).show();
loadData();
} else {
Toast.makeText(MainActivity.this, "添加失败", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onError(Throwable t) {
Log.e(TAG, "onError: Failed", t);
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete");
}
});
}
总结
通过以上步骤,我们成功地将 RxJava2 和 SQLite 数据库结合,实现了使用 Flowable 异步更新数据并展示到页面上的功能,为我们的应用提供了更好的用户体验和更高的效率。同时,这种结合也为我们提供了更灵活的扩展空间,便于在日后的开发中应对更多的需求。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Rxjava2_Flowable_Sqlite_Android数据库访问实例 - Python技术站