当前位置:首页 > 行业动态 > 正文

安卓开发如何查询数据库连接

本地数据库查询(以SQLite为例)

创建数据库帮助类

使用SQLiteOpenHelper创建数据库和表结构:

安卓开发如何查询数据库连接

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "app.db";
    private static final int VERSION = 1;
    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建表语句
        db.execSQL("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 更新表逻辑
    }
}

执行查询操作

// 获取可读数据库
SQLiteDatabase db = helper.getReadableDatabase();
// 查询语句
Cursor cursor = db.rawQuery("SELECT  FROM users WHERE id = ?", new String[]{"1"});
// 遍历结果
if (cursor.moveToFirst()) {
    do {
        int id = cursor.getInt(cursor.getColumnIndex("id"));
        String name = cursor.getString(cursor.getColumnIndex("name"));
        // 处理数据
    } while (cursor.moveToNext());
}
cursor.close(); // 必须关闭游标

使用Room持久库(推荐方式)

// 定义实体
@Entity
public class User {
    @PrimaryKey()
    public int id;
    public String name;
}
// 定义DAO
@Dao
public interface UserDao {
    @Query("SELECT  FROM user WHERE id = :userId")
    User getUserById(int userId);
}
// 使用方式
AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app.db").build();
User user = db.userDao().getUserById(1);

远程数据库查询(以MySQL为例)

配置网络权限

AndroidManifest.xml中添加:

<uses-permission android:name="android.permission.INTERNET" />

使用网络库发送请求

// Retrofit示例
public interface ApiService {
    @GET("users")
    Call<List<User>> getUsers();
}
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://example.com/api/")
    .addConverterFactory(GsonConverterFactory.create())
    .build();
ApiService api = retrofit.create(ApiService.class);
Call<List<User>> call = api.getUsers();
call.enqueue(new Callback<List<User>>() {
    @Override
    public void onResponse(Call<List<User>> call, Response<List<User>> response) {
        if (response.isSuccessful()) {
            // 处理数据
        }
    }
    @Override
    public void onFailure(Call<List<User>> call, Throwable t) {
        // 处理错误
    }
});

常见问题与解决方案

问题现象 解决方案
数据库连接失败 检查网络权限、服务器地址、防火墙设置
主线程操作数据库 使用AsyncTaskExecutorService处理耗时操作
SQLite数据库文件不存在 确认SQLiteOpenHelperonCreate方法被调用
远程查询返回空数据 检查网络请求参数、服务器接口是否正常响应

相关问题与解答

问题1:如何更新本地数据库中的数据?

解答
使用SQLiteDatabase.update()方法或Room的@Update注解。

// SQLite方式
ContentValues values = new ContentValues();
values.put("name", "New Name");
db.update("users", values, "id = ?", new String[]{"1"});
// Room方式
@Dao
public interface UserDao {
    @Update
    void updateUser(User user);
}

问题2:如何处理多线程并发查询?

解答

  1. 本地数据库操作建议在子线程执行,避免阻塞UI
  2. 使用synchronized关键字保证线程安全
  3. Room库自带线程处理机制,自动在后台线程执行查询
  4. 远程查询需配合LiveDataRxJava实现异步响应式