You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Assets目录读取SQLite数据库并将数据存入ArrayList?

当然可行!从Assets目录读取SQLite数据库并把数据存入ArrayList是Android开发里挺常见的操作,尤其是你需要给App预装一些初始数据的时候。下面我会把实现思路拆解清楚,再附上完整的代码示例,你可以直接参考着来做~

可行性确认

完全没问题!不过要注意:Assets目录下的文件是打包在APK里的,无法直接进行写入操作。如果只是读取数据,我们只需要先把数据库文件复制到应用的私有存储目录(只有当前App能访问的安全目录),之后就可以像操作普通SQLite数据库一样查询数据,再把结果存入ArrayList了。

实现步骤
  • 第一步:把你的SQLite数据库文件(比如your_database.db)放到项目的src/main/assets目录下,如果没有assets目录,直接在main文件夹下新建一个就行。
  • 第二步:编写代码将Assets里的数据库复制到应用的databases私有目录,因为SQLiteDatabase无法直接打开Assets里的文件。
  • 第三步:查询数据库中的数据,遍历结果集(Cursor),把每条数据封装成实体类对象,再添加到ArrayList中。
完整代码示例

1. 先定义数据实体类

假设你的数据库里有一张user表,包含id、name、age三个字段,我们先写一个对应的实体类来存储每条数据:

public class User {
    private int id;
    private String name;
    private int age;

    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    // Getter方法,方便后续获取数据
    public int getId() { return id; }
    public String getName() { return name; }
    public int getAge() { return age; }
}

2. 编写数据库操作帮助类

这个类负责完成数据库复制和数据查询的核心逻辑:

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;

public class DBHelper {
    private static final String TAG = "DBHelper";
    private static final String DB_NAME = "your_database.db"; // 替换成你Assets里的数据库文件名
    private static final String DB_PATH = "/data/data/%s/databases/"; // 应用私有数据库目录的路径模板
    private Context mContext;

    public DBHelper(Context context) {
        this.mContext = context;
    }

    // 复制Assets中的数据库到应用私有目录
    public void copyDatabase() throws IOException {
        // 检查数据库是否已经存在,避免重复复制
        File dbFile = new File(mContext.getFilesDir().getParentFile().getPath() + "/databases/" + DB_NAME);
        if (dbFile.exists()) {
            Log.d(TAG, "数据库已存在,无需重复复制");
            return;
        }

        // 创建数据库存储目录
        File dbDir = new File(String.format(DB_PATH, mContext.getPackageName()));
        if (!dbDir.exists()) {
            dbDir.mkdirs();
        }

        // 从Assets读取数据库文件,写入到目标目录
        InputStream inputStream = mContext.getAssets().open(DB_NAME);
        OutputStream outputStream = new FileOutputStream(dbFile);

        byte[] buffer = new byte[1024];
        int length;
        while ((length = inputStream.read(buffer)) > 0) {
            outputStream.write(buffer, 0, length);
        }

        // 关闭流资源
        outputStream.flush();
        outputStream.close();
        inputStream.close();
        Log.d(TAG, "数据库复制完成");
    }

    // 查询所有用户数据,并存入ArrayList返回
    public ArrayList<User> getAllUsers() {
        ArrayList<User> userList = new ArrayList<>();
        SQLiteDatabase db = null;
        Cursor cursor = null;

        try {
            // 打开私有目录中的数据库(只读模式)
            db = SQLiteDatabase.openDatabase(
                    mContext.getFilesDir().getParentFile().getPath() + "/databases/" + DB_NAME,
                    null,
                    SQLiteDatabase.OPEN_READONLY
            );

            // 编写查询语句,替换成你的表名和字段
            String query = "SELECT id, name, age FROM user";
            cursor = db.rawQuery(query, null);

            // 遍历Cursor,把每条数据封装成User对象加入ArrayList
            if (cursor.moveToFirst()) {
                do {
                    int id = cursor.getInt(cursor.getColumnIndexOrThrow("id"));
                    String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));
                    int age = cursor.getInt(cursor.getColumnIndexOrThrow("age"));
                    userList.add(new User(id, name, age));
                } while (cursor.moveToNext());
            }
        } catch (Exception e) {
            Log.e(TAG, "查询数据失败: " + e.getMessage());
        } finally {
            // 务必关闭Cursor和数据库连接,避免资源泄漏
            if (cursor != null) {
                cursor.close();
            }
            if (db != null) {
                db.close();
            }
        }

        return userList;
    }
}

3. 在Activity中调用示例

在你的主Activity里,就可以这样使用上面的帮助类:

import android.os.Bundle;
import android.util.Log;

import androidx.appcompat.app.AppCompatActivity;

import java.io.IOException;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DBHelper dbHelper = new DBHelper(this);

        try {
            // 先完成数据库复制
            dbHelper.copyDatabase();
            // 获取所有用户数据的ArrayList
            ArrayList<User> userList = dbHelper.getAllUsers();
            // 打印测试数据,验证是否成功读取
            for (User user : userList) {
                Log.d(TAG, "用户信息: id=" + user.getId() + ", name=" + user.getName() + ", age=" + user.getAge());
            }
        } catch (IOException e) {
            Log.e(TAG, "复制数据库失败: " + e.getMessage());
        }
    }
}
注意事项
  • 记得把代码中的DB_NAME替换成你Assets里的实际数据库文件名,查询语句也要对应你的表结构修改。
  • 如果数据库文件比较大,建议把复制和查询操作放到异步线程中执行(比如用Kotlin协程、Java的AsyncTask或者Thread),避免阻塞主线程导致App卡顿。
  • Android 6.0及以上版本不需要申请额外的存储权限,因为我们操作的是应用的私有目录,系统默认允许访问。

内容的提问来源于stack exchange,提问作者typo_18

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:28:11