0

我正在尝试使用我的 Android 应用程序发送一个 SQL 文件并让应用程序使用它。我在资产文件夹中有该文件,并在创建应用程序时检查并在必要时复制它。我关注了这篇博文:http ://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

安装时,该 sql 文件位于 assets 目录中,并且它确实执行了看似正确的写入操作,但该文件并未出现在文件系统的任何位置。

这是我的数据库助手的代码:

package com.example.myapp;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DataBaseHelper extends SQLiteOpenHelper {
private static String DB_PATH;
private static String DB_NAME = "myapp.sql";
private SQLiteDatabase myDataBase;
private final Context myContext;

public DataBaseHelper(Context context){
    super(context, DB_NAME, null, 1);
    this.myContext = context;
    DB_PATH = myContext.getFilesDir().getPath();
}

public void createDatabase() throws IOException {
    boolean dbExist = checkDataBase();
    if (dbExist) {
        // do nothing, db exists
    } else {
        this.getReadableDatabase();

        try {
            copyDataBase();
        } catch (IOException e) {
            throw new Error("Error copying database");
        }
    }
}

private boolean checkDataBase() {
    SQLiteDatabase checkDB = null;

    try {
        String myPath = DB_PATH + "/" + DB_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
    } catch (SQLiteException e) {
        // database doesn't exist yet
    }

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

    if (checkDB != null) {
        Log.e("myapp", "Database exists");
    }

    return checkDB != null ? true : false;
}

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;
    Log.e("myapp", outFileName);

    //Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);
    BufferedOutputStream os = new BufferedOutputStream(myOutput);

    //transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer))>0){
        Log.e("myapp", "writing buffer");
        os.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_READONLY);

}

@Override
public synchronized void close() {

        if(myDataBase != null)
            myDataBase.close();

        super.close();

}

@Override
public void onCreate(SQLiteDatabase db) {

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
}

对于我的主要活动:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    DataBaseHelper dbHelper = new DataBaseHelper(this);

    try {
        dbHelper.createDatabase();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        //e.printStackTrace();
        Log.e("myapp", "ERROR in creating database");
    }

    try {
        dbHelper.openDataBase();
    } catch (SQLException sqle) {
        Log.e("myapp", "ERROR in opening database");
        throw sqle;
    }

    SQLiteDatabase db = dbHelper.getReadableDatabase();

    String sortOrder =
            MyApp.COLUMN_NAME_NAME + " DESC";

    Cursor c = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);
    if (c.moveToFirst()) {
        while (!c.isAfterLast()) {
            Log.e("myapp", c.getString(c.getColumnIndex("name")));
            c.moveToNext();
        }
    }
}
4

1 回答 1

0

我不得不重写getReadableDatabase辅助类的函数,因为它不知道要返回myDatabase。助手正确加载它和所有内容,但它从未真正返回它。

@Override
public SQLiteDatabase getReadableDatabase(){
    return myDataBase;
}
于 2013-06-24T19:02:24.680 回答