Android:使用 .sqlite 扩展名访问 Assets 文件夹 sqlite 数据库文件

标签 android

如何从我的 Android 应用程序中的 Assets 文件夹 sqlite 数据库文件中读取数据,扩展名为 .sqlite?

最佳答案

试试这个代码:

public class DataBaseHelper extends SQLiteOpenHelper {
    private Context mycontext;

    //private String DB_PATH = mycontext.getApplicationContext().getPackageName()+"/databases/";
    private static String DB_NAME = "(datbasename).sqlite";//the extension may be .sqlite or .db
    public SQLiteDatabase myDataBase;
    /*private String DB_PATH = "/data/data/"
                        + mycontext.getApplicationContext().getPackageName()
                        + "/databases/";*/

    public DataBaseHelper(Context context) throws IOException {
        super(context,DB_NAME,null,1);
        this.mycontext=context;
        boolean dbexist = checkdatabase();
        if (dbexist) {
            //System.out.println("Database exists");
            opendatabase(); 
        } else {
            System.out.println("Database doesn't exist");
            createdatabase();
        }
    }

    public void createdatabase() throws IOException {
        boolean dbexist = checkdatabase();
        if(dbexist) {
            //System.out.println(" Database exists.");
        } else {
            this.getReadableDatabase();
            try {
                copydatabase();
            } catch(IOException e) {
                throw new Error("Error copying database");
            }
        }
    }   

    private boolean checkdatabase() {
        //SQLiteDatabase checkdb = null;
        boolean checkdb = false;
        try {
            String myPath = DB_PATH + DB_NAME;
            File dbfile = new File(myPath);
            //checkdb = SQLiteDatabase.openDatabase(myPath,null,SQLiteDatabase.OPEN_READWRITE);
            checkdb = dbfile.exists();
        } catch(SQLiteException e) {
            System.out.println("Database doesn't exist");
        }
        return checkdb;
    }

    private void copydatabase() throws IOException {
        //Open your local db as the input stream
        InputStream myinput = mycontext.getAssets().open(DB_NAME);

        // Path to the just created empty db
        String outfilename = DB_PATH + DB_NAME;

        //Open the empty db as the output stream
        OutputStream myoutput = new FileOutputStream("/data/data/(packagename)/databases   /(datbasename).sqlite");

        // transfer byte to inputfile to outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myinput.read(buffer))>0) {
            myoutput.write(buffer,0,length);
        }

        //Close the streams
        myoutput.flush();
        myoutput.close();
        myinput.close();
    }

    public void opendatabase() throws SQLException {
        //Open the database
        String mypath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(mypath, null, SQLiteDatabase.OPEN_READWRITE);
    }

    public synchronized void close() {
        if(myDataBase != null) {
            myDataBase.close();
        }
        super.close();
    }

}

关于Android:使用 .sqlite 扩展名访问 Assets 文件夹 sqlite 数据库文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2605555/

相关文章:

android - 使用 Camera2 API 的低 FPS

android - 找不到参数的方法 compile() [com.google.gms :google-services:4. 0.0]

android - 如何在任何 Activity 中禁用虚拟主页按钮?

java - Java中的Socket编程发送和接收字节数组

android - RxJava - 获取列表,对其项目进行操作,再次分组到列表中。 toList() 等待 onCompleted()

android - AppWidget 第一次添加时没有完成更新

android - 使用 fetch 在 react-native 中发布一个 blob

android - 无法将计数值设置为列

android - 如何在 android 中使用 getRunningAppProcesses()?

android - Android内存转储中的EGL和GL mtrack是什么