0

我无法将 SQLite 数据库从评估文件夹复制到设备内存(在模拟器上尝试)。

我在项目的assets 文件夹中有一个数据库,其中有一个包含 1000行预先存在的行的表。

我打算将现有文件从资产文件夹复制到模拟器的数据库文件夹中。

活动片段

     @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

            //All views(list,textboxes) are declared.
    try {
        dbM = new DbManager(this);
        dbM.checkDataBase();

        try {
            dbM.createDataBase();
        } catch (Exception e) {
            throw new Error(" *** ERROR in DB Access *** " + e.getMessage());
        }

        dbM.openDB();
        symbolarr = dbM.getSymbol();

        lv.setAdapter(new ArrayAdapter<String>(this,
         android.R.layout.simple_list_item_1, symbolarr));
                } catch (Exception e) {
        throw new Error(" *** ERROR in onCreate *** " + e.getMessage());
    }

    finally {
        dbM.close();
    }
}

我的 DbManager 类中的一段代码:

    public boolean checkDataBase() {

    String myPath = DATABASE_PATH + DATABASE_NAME;
    File f = new File(myPath);
    return f.exists();
}

public void createDataBase() {

    try {
        InputStream myInput = ctx.getAssets().open(DATABASE_NAME);
        OutputStream myOutput = new FileOutputStream(DATABASE_PATH
                + DATABASE_NAME);

        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }
        myOutput.flush();
        myOutput.close();
        myInput.close();

    } catch (FileNotFoundException e) {
        throw new Error("file not found --  " + e.getMessage());
    } catch (IOException e) {
        throw new Error("io exception " + e.getMessage());
    } catch (Exception e) {
        throw new Error(" exception " + e.getMessage());
    }
}

public DbManager openDB() throws SQLException {
    dbmgr = new DbManager(ctx);
    mDb = dbmgr.getWritableDatabase();
    return this;
}

public String[] getSymbol() {
    Cursor cur;
    try {
        cur = mDb.rawQuery("select symbol,company_name from Scrip", null);
    } catch (SQLiteException e) {
        throw new Error(" *** ERROR in cursor *** " + e.getMessage());
    }

    String[] b1 = new String[1326];
    int x = 0;
    if (cur.moveToFirst()) {
        do {
            b1[x] = cur.getString(cur.getColumnIndex("symbol"));
            x++;
        } while (cur.moveToNext());
    }
    cur.close();
    return b1;
}

LOGCAT

    FATAL EXCEPTION: main


 java.lang.Error: file not found --  AndroidDB.db
    at com.dbexample.DbManager.createDataBase(DbManager.java:113)
    at com.dbexample.DataAttach.onCreate(DataAttach.java:83)
    at android.app.Activity.performCreate(Activity.java:4465)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
    at android.app.ActivityThread.access$600(ActivityThread.java:122)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4340)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    at dalvik.system.NativeStart.main(Native Method)

笔记

1:更改缓冲区大小无济于事..

2:我的资产文件夹中有一个名为 AndroidDB.db 的文件,大小为 62kb。

3:数据库名称(在我的资产文件夹和我的代码中)是相同的,我的数据库中有 android_metadata 表,它位于资产文件夹中。

4:不使用时createDataBase(), 数据库正在创建,但我想要的表 ieScrip 没有被复制。因此,当我尝试从表中获取数据时,我遇到了一个异常no such table Scrip......这意味着我需要将Scrip表从资产文件夹复制到模拟器内存​​上的数据库。当我尝试使用 做同样的事情时createDataBase(),我得到了 nullPointerException

5.:当我在 createDatabase() 中尝试以下代码时

AssetManager assetManager = ctx.getAssets();
            String[] files = assetManager.list("Files");

            for (int i = 0; i < files.length; i++) {
                str[i] = "\n=" + " file=" + " :" + i + "=" + " name=" + "> "
                        + files[i];
            }
            Log.v("len=", "" + files.length);

然后 files.length 等于0。这仅仅意味着它无法检测到资产文件夹中的任何文件。

任何帮助都将挽救生命!

4

3 回答 3

4

编辑:用这个替换你的代码,让我知道发生了什么,(这在我的情况下很好......)

DbManager.java 类:

public class DbManager {
private DatabaseHelper dataHelper;
private SQLiteDatabase  mDb;
Context ctx;
String DATABASE_PATH = "/data/data/com.demo/databases/";
static String DATABASE_NAME="AndroidDB";

private static final int DATABASE_VERSION = 1;
DbManager(Context ctx)
{
    this.ctx = ctx;
    dataHelper = new DatabaseHelper(ctx);

}

private static class DatabaseHelper extends SQLiteOpenHelper {

    Context myContext = null;

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.myContext = context;
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

        Log.w("DBHelper", "Upgrading database from version "
                        + oldVersion + " to " + newVersion
                        + ", which will destroy all old data");

        onCreate(db);

    }

}


   public boolean checkDataBase() {

        String myPath = DATABASE_PATH + DATABASE_NAME;
        File f = new File(myPath);
        return f.exists();
    }

    public void createDataBase() {

        openDB();            
        try {
            InputStream myInput = ctx.getAssets().open("AndroidDB.db");
            OutputStream myOutput = new FileOutputStream(DATABASE_PATH
                    + "AndroidDB");

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

            if (mDb.isOpen())
                mDb.close();
            myOutput.flush();
            myOutput.close();
            myInput.close();

        } catch (FileNotFoundException e) {
            throw new Error("file not found --  " + e.getMessage());
        } catch (IOException e) {
            throw new Error("io exception " + e.getMessage());
        } catch (Exception e) {
            throw new Error(" exception " + e.getMessage());
        }
    }

    public DbManager openDB() throws SQLException {

        mDb = dataHelper.getWritableDatabase();
        return this;
    }

    public String[] getSymbol() {
        Cursor cur;
        try {
            cur = mDb.rawQuery("select symbol,company_name from Scrip", null);
        } catch (SQLiteException e) {
            throw new Error(" *** ERROR in cursor *** " + e.getMessage());
        }

        String[] b1 = new String[1326];
        int x = 0;
        if (cur.moveToFirst()) {
            do {
                b1[x] = cur.getString(cur.getColumnIndex("symbol"));
                x++;
            } while (cur.moveToNext());
        }
        cur.close();
        return b1;
    }

    public void close() {
        try {
            mDb.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

 }

}
于 2011-12-13T09:51:20.490 回答
0

检查您添加的数据库名称和写入错误的名称是否相同?(AndroidDB.db) 还要确保您的数据库中有 android_metadata 表。:)

于 2011-12-13T09:50:23.620 回答
0

认为您可以从现有数据库中获取路径。那么为什么不让Android先创建数据库呢?

在复制您的数据库之前尝试执行“getWritableDb”。然后通过“db.getPath()”获取路径并使用此路径从资产中复制。

这对我有用。

于 2011-12-13T10:31:04.340 回答