0

我已经坚持了一段时间了,我多次更改我的代码,这让我很痛苦。无论如何,我已经在 sql 数据库浏览器中创建了一个数据库,我一直在阅读如何将它放置在我正在开发的应用程序中时刻。所以我把它放在我的资产文件夹中并创建了一个数据库助手 java 类。但我只是可以将我的 DB 文件放入 Eclipse DDMS 我查看了堆栈溢出的答案,但只是不知道问题出在哪里。我再次将我的 DBHelper 代码更改为Database not copying from assets并且在我的 DDMS 中仍然没有 DB 文件。

你看到的图像是我现在的样子。这是我对 android 新手所做的第一个计算机编码。谢谢

http://s1.postimg.org/6u667r3bj/snip1.jpg

http://s13.postimg.org/l5vsas40n/snip2.jpg

   package com.mybasicapp;

   import java.io.File;
   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;

   public class DataBaseHelper extends SQLiteOpenHelper{
   private Context mycontext;

  private String DB_PATH = "/data/data/gr.peos/databases/";
 //private String DB_PATH = 
 mycontext.getApplicationContext().getPackageName()+"/databases/";
 private static String DB_NAME = "BLib.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/gr.peos/databases  
  /BLib.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();
    }

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

    }

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

   }
   }
4

3 回答 3

0

If I understand you correct, you wont to add a ready SQLite file to you db folder.

  1. Open your emulator and make sure it's selected.

  2. In the DDMS open /data/data/[your_package_name]/databases folder and select it.

  3. Use the - + buttons to pull and insert the files.

enter image description here

于 2013-04-25T19:02:31.103 回答
0

使用 SQLiteOpenHelper 是正确的方法。这对我很有效。但是,我要覆盖的唯一功能是

public void onCreate(SQLiteDatabase db) 
public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) 

我想我让它在其默认位置创建数据库,在我的应用程序内部存储区域的根目录中。

就您而言,如果我了解您发布的内容,您希望将数据库从资产文件夹复制到内部存储。我的建议是 4 个部分:

  1. 暂时让 Android 为你创建一个空的 db 并弄清楚它放在哪里。
  2. 修改您的 copyDatabase 代码以复制到该位置。
  3. 重写 onCreate 以调用 copyDatabase。Android 只会在不存在数据库时调用 onCreate,因此您可以无条件调用 copyDatabase。
  4. 将来,当您进行架构更改时,请在 onUpgrade 中处理它们。

这应该就是全部了。让我知道你在这方面的进展情况。

一个警告:onCreate 已经创建了一个空数据库,所以我不确定从资产复制数据库是否会起作用,而无需以某种方式关闭并重新打开数据库。我正在使用的另一种方法是将 DDL 放在您的资产文件中,然后在 onCreate 中处理它。像这样的东西(除了我使用的是字符串数组而不是资产文件):

String[] ddl = 
{
  "CREATE TABLE [T1] ([id] INTEGER NOT NULL, [col1] CHAR);" +
  "CREATE TABLE [T2] ([id] INTEGER NOT NULL, [col2] CHAR)";
};

db.beginTransaction();
try
{
  for (int i = 0, limit = ddl.length;  i < limit;  i++)
    db.execSQL (ddl [i]);
} finally {
  db.endTransaction();
}
于 2013-04-25T19:15:10.397 回答
0

您不必创建数据库并在项目中手动移动它。如果它不存在,它将自动创建。因此,有 2 种方法可以覆盖创建数据库并在数据库版本更改时对其进行更改。打电话

super(context, DB_NAME, null, 1);

在构造函数中,“1”是您的数据库版本。如果将其更改为“2”并且数据库已经存在,则会调用“onUpgrade”。

public void onCreate(SQLiteDatabase db)

如果您的数据库不存在,将自动调用。在此,您想向其中添加表格。

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

如果设备上的数据库版本低于应用程序中给定的数据库版本,将自动调用。在这种方法中,如果表格在版本之间发生了变化,您可以更改表格。

我建议创建第二个类来与您的数据库交互(打开/关闭/插入)。看看这个教程:http ://www.vogella.com/articles/AndroidSQLite/article.html#databasetutorial_database

于 2013-04-25T19:01:58.537 回答