Android:当试图将SQL文件从资产复制到应用程序数据目录时,文件系统上没有显示文件



我正试图将一个SQL文件与我的Android应用程序一起发送,并让该应用程序使用它。我将该文件放在assets文件夹中,并在创建应用程序时检查并复制(如有必要)。我关注了这篇博客文章: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();
        }
    }
}

我不得不重写helper类的getReadableDatabase函数,因为它不知道返回myDatabase。助手正确地加载它和所有的东西,但它从来没有真正返回它。

@Override
public SQLiteDatabase getReadableDatabase(){
    return myDataBase;
}

相关内容

  • 没有找到相关文章

最新更新