Android studio引入外部SQLite数据库,获取数据库列表数据

本文详细介绍了如何在Android Studio项目中导入并使用SQLite数据库。首先,准备SQLite数据库并创建数据库类MyDatabaseHelper。然后,在assets目录下放置SQLite文件,并在onCreate()方法中调用数据库导入方法。此外,还展示了如何获取数据库数据,创建对应数据类UserDemo,以及从数据库中获取User数据的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备工作:

准备好Android studio和一个创建管理数据库的软件,推荐SQLite Expert Professional或者Navicat Premium。这里以SQLite Expert Professional为例。

创建外部数据库:

1.穿件sqlite数据库,按照自己的项目要求定义数据库和相应的数据表

导入数据库到Android studio项目中

1.在main目录下创建assets文件,将准备好的sqlite数据库文件放入这个目录下

解释:assets文件夹下的文件在应用被打包成apk时不会被压缩

2.在main目录下的java目录下的com.example.xxxx包内创建一个java类,用于管理数据库,如图所示的MyDatabaseHelper

 3.在数据库的类中完成数据库的导入

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;


public class MyDatabaseHelper {

    //导入的sqlite数据库文件名
    private final String DB_NAME = "questionCenter.db";
    private SQLiteDatabase myDatabase;
    private Context context;

    //定义类的方法
    public MyDatabaseHelper(Context context) {
        this.context = context;
    }





    // 复制和加载区域数据库中的数据
    public String CopyDBFile() throws IOException {

        // 在第一次运行应用程序时,加载数据库到data/data/当前包的名称/database/数据库名字
        //获取准确的路径,context.getPackageName()得到包名
        File dir = new File("data/data/" + context.getPackageName() + "/databases");
        //如果文件夹不存在,则创建指定的文件
        if (!dir.exists() || !dir.isDirectory()) {
            dir.mkdir();
        }
        //文件声明
        File file = new File(dir, DB_NAME);
        //输入流
        InputStream inputStream = null;
        //输出流
        OutputStream outputStream = null;
        //若不存在,通过IO流的方式,将assets目录下的数据库文件,写入到项目模拟手机中,当开启模拟 
        //器时,会将数据库文件写入到模拟手机的内存中
        if (!file.exists()) {
            try {
                //创建文件
                file.createNewFile();
                //加载文件
                inputStream = context.getClass().getClassLoader().getResourceAsStream("assets/" + DB_NAME);
                //输出到文件
                outputStream = new FileOutputStream(file);

                byte[] buffer = new byte[1024];
                int len;
                //按字节写入
                while ((len = inputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, len);
                }


            } catch (IOException e) {
                e.printStackTrace();

            } finally {
                //关闭资源
                if (outputStream != null) {

                    outputStream.flush();
                    outputStream.close();

                }
                if (inputStream != null) {
                    inputStream.close();
                }

            }

        }

        return file.getPath();
    }
}

4.打开自己安卓项目运行时的第一个Activity,在对应的oncreate()方法,使用数据库类中定义的数据库导入的方法,完成数据库的初始化操作

注意:不一定是在第一个Activity中,但必须是在项目使用数据库之前的那个Activity中导入数据库

 //导入数据库到创建的文件中
MyDatabaseHelper myHelper = new MyDatabaseHelper(WelcomeActivity.this);
        try {
            myHelper.CopyDBFile();
        } catch (IOException e) {
            e.printStackTrace();
        }

在如图位置:

5.在对应的Activity的oncreate()方法中使用如图的代码可打开数据库,进行crud操作,增删查改、获取数据库数据

 获取数据库数据:(使用list集合)

1.在项目里面定义一个java类,用于定义数据表对应的列名。如用户表为例:

 对应的用户类的代码如下:

public class UserDemo {
    //对应userInfo数据库中的数据信息
    public String username;
    public String password;
    public  String savepsd;
    public String autologin;
    public String isregister;
    public int lastscore;

}

 2.按照自己的要求获取数据表的信息数据

 //获取数据库的用户数据
    public List<UserDemo> getUsers(){
        List<UserDemo> list=new ArrayList<UserDemo>();
        //这是获取完整数据表信息的方法
        Cursor cursor = myDatabase.query("userInfo.db",null,null,null,null,null,null);
        //也可以使用Cursor对象的rawQuery方法,使用sql指定的数据
        //Cursor cursor = myDatabase.rawQuery("select * from userInfo",null);
        if(cursor.getCount()>0){
            cursor.moveToFirst();//将cursor移动到第一个光标上
            int count=cursor.getCount();
            //将cursor中的每一条记录生成一个question对象,并将该question对象添加到list中
            for(int i=0;i<count;i++){
                cursor.moveToPosition(i);
                UserDemo users =new UserDemo();
                users.username=cursor.getString(cursor.getColumnIndex("username"));
                users.lastscore=cursor.getInt(cursor.getColumnIndex("lastscoren"));
                users.password=cursor.getString(cursor.getColumnIndex("password"));
                users.autologin=cursor.getString(cursor.getColumnIndex("autologin"));
                users.savepsd=cursor.getString(cursor.getColumnIndex("savepsd"));
                users.isregister=cursor.getString(cursor.getColumnIndex("isregister"));
                list.add(users);
            }
           // System.out.println(list.get(2)); //可输出list集合的数据
        }
        return list;
    }

3.通过集合获取到数据后,可以按照自己的要求进行相应的功能实现

如果需要对导入的数据库进行操作,可参照外部sqlite数据库导入后对数据库进行操作https://blog.youkuaiyun.com/NXBBC/article/details/123734221?spm=1001.2014.3001.5502

<think>嗯,用户想了解在Android Studio中对外部存储数据库进行增删改查的操作方法。首先,我需要确认用户所说的“外部存储”具体指的是什么。根据Android数据存储方式,外部存储通常分为两种:公共外部存储和私有外部存储。公共外部存储需要权限,而私有外部存储位于应用专属目录,不需要权限。但用户提到的是数据库操作,所以可能是指将数据库文件存储在外部存储的位置,比如SD卡或者其他公共目录。 接下来,我需要回顾Android数据库操作的基本方法。通常,使用SQLiteOpenHelper来创建和管理数据库,但默认情况下数据库是存储在内部存储的data/data/包名/databases目录下。如果用户希望将数据库放在外部存储,可能需要修改数据库的存储路径。这涉及到检查外部存储的可用性,获取外部存储的目录路径,并在创建数据库时指定该路径。 然后,权限问题。从Android 6.0(API 23)开始,访问外部存储需要动态请求权限,比如READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE。在Android 10(API 29)及以上,作用域存储(Scoped Storage)被引入,应用对公共目录的访问受限,可能需要使用MediaStore或者选择应用专属的外部存储目录,这部分是否需要特殊处理? 另外,用户提到的增删改查操作,需要自定义SQLiteOpenHelper,重写onCreate和onUpgrade方法,然后通过获取可写或可读数据库实例来执行SQL操作。但外部存储的情况下,可能需要确保数据库文件的路径正确,并且有足够的权限进行读写。 还需要考虑数据库的安全性。外部存储的数据库文件可能被其他应用访问或修改,因此如果存储敏感数据,可能存在风险。用户是否了解这一点,或者是否有必要提醒? 现在,结合用户提供的引用内容,引用[1]、[2]和[4]提到了SQLiteOpenHelper的使用,数据库的创建和基本操作。引用[3]和[4]说明了Android数据存储方式,包括SQLite作为本地数据库。引用[5]展示了删除数据的方法,但代码中使用了内部数据库的方式。用户需要将这些操作适配到外部存储。 可能步骤: 1. 修改数据库路径到外部存储目录。 2. 处理权限请求。 3. 自定义DatabaseHelper,指定外部存储路径。 4. 实现增删改查方法,确保路径正确。 5. 处理Android版本差异,尤其是Scoped Storage带来的变化。 需要注意在AndroidManifest.xml中添加权限,并在运行时请求权限。同时,外部存储可能不可用(如SD卡被移除),需要异常处理。 现在,将这些步骤整理成用户指南,分步骤说明,包括代码示例,权限配置,以及注意事项。</think>### Android Studio 外部存储数据库操作指南 在Android中,若要将SQLite数据库存储在**外部存储**(如应用专属外部目录或公共目录),需注意权限管理、路径配置和版本适配。以下是具体实现步骤: --- #### 一、配置权限 1. **AndroidManifest.xml 添加权限** 根据目标Android版本选择权限配置: ```xml <!-- 适用于Android 9及以下 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- Android 10及以上需添加作用域存储声明 --> <application android:requestLegacyExternalStorage="true"> ``` 2. **动态请求权限** 在Activity中检查并请求权限: ```java if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE); } ``` --- #### 二、自定义数据库路径 1. **获取外部存储路径** 使用`Context.getExternalFilesDir()`获取应用专属外部目录(无需权限): ```java File dbDir = new File(context.getExternalFilesDir(null), "databases"); if (!dbDir.exists()) dbDir.mkdirs(); String dbPath = new File(dbDir, "mydb.db").getAbsolutePath(); ``` 2. **继承SQLiteOpenHelper并指定路径** 重写构造函数以自定义数据库路径: ```java public class ExternalDBHelper extends SQLiteOpenHelper { public ExternalDBHelper(Context context) { super(context, dbPath, null, 1); // dbPath为外部存储路径 } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {} } ``` --- #### 三、实现增删改查操作 1. **插入数据** ```java public void insertData(String name) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", name); db.insert("user", null, values); db.close(); } ``` 2. **查询数据** ```java public List<String> getAllUsers() { List<String> users = new ArrayList<>(); SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery("SELECT name FROM user", null); if (cursor.moveToFirst()) { do { users.add(cursor.getString(0)); } while (cursor.moveToNext()); } cursor.close(); return users; } ``` 3. **更新数据** ```java public int updateUser(int id, String newName) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", newName); return db.update("user", values, "id=?", new String[]{String.valueOf(id)}); } ``` 4. **删除数据** ```java public boolean deleteUser(int id) { SQLiteDatabase db = this.getWritableDatabase(); int result = db.delete("user", "id=?", new String[]{String.valueOf(id)}); return result > 0; } ``` --- #### 四、注意事项 1. **版本兼容性** - Android 10及以上需启用`requestLegacyExternalStorage`以临时禁用作用域存储[^4]。 - 长期方案应迁移到`MediaStore`或应用专属目录。 2. **安全性** - 外部存储数据可能被其他应用读取,敏感数据建议存储在内部目录[^3]。 3. **异常处理** - 检查外部存储状态: ```java if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { // 存储不可用 } ``` ---
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值