0

私はしばらくこれに固執しており、iv はコードを何度も変更したので、私は苦痛です.とにかく、SQL データベースブラウザーで DB を作成しました。瞬間。それをアセットフォルダーに配置し、データベースヘルパーJavaクラスを作成しました。しかし、DBファイルをEclipse DDMSに入れることができます。スタックオーバーフローの回答を見ましたが、問題がどこにあるのかわかりません。DBHelper コードを再度データベースに変更し、アセットからコピーせず、DDMS に DB ファイルをまだ作成していません。

あなたが見ている画像は、私が今のところのものです。これは、Android を初めて使用した最初のコンピューター コーディング iv です。ありがとうございます

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

データベースを作成してプロジェクト内で手動で移動する必要はありません。存在しない場合は自動的に作成されます。したがって、データベースを作成し、データベースのバージョンが変更された場合に変更するためにオーバーライドする方法は 2 つあります。電話するだけ

super(context, DB_NAME, null, 1);

ここで、「1」はデータベースのバージョンです。「2」に変更すると、データベースがすでに存在する場合、「onUpgrade」が呼び出されます。

public void onCreate(SQLiteDatabase db)

データベースが存在しない場合、自動的に呼び出されます。これにテーブルを追加します。

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

デバイスのデータベース バージョンがアプリで指定されたデータベース バージョンより低い場合、自動的に呼び出されます。この方法では、バージョン間でテーブルが変更された場合にテーブルを変更します。

データベースと対話する (開く/閉じる/挿入する) ための 2 番目のクラスを作成することをお勧めします。このチュートリアルをご覧ください: http://www.vogella.com/articles/AndroidSQLite/article.html#databasetutorial_database

于 2013-04-25T19:01:58.537 に答える
0

あなたが正しいことを理解していれば、準備ができている SQLite ファイルを db フォルダーに追加する必要はありません。

  1. エミュレーターを開き、それが選択されていることを確認します。

  2. DDMS で /data/data/[your_package_name]/databases フォルダーを開き、それを選択します。

  3. - + ボタンを使用して、ファイルをプルして挿入します。

ここに画像の説明を入力

于 2013-04-25T19:02:31.103 に答える
0

SQLiteOpenHelper を使用するのが正しい方法です。それは私にとってとてもうまくいきます。ただし、私がオーバーライドしている唯一の機能は

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

アプリの内部ストレージ領域のルートにあるデフォルトの場所にデータベースを作成できるようにしています。

あなたの場合、あなたが投稿した内容が理解できれば、assets フォルダーからデータベースを内部ストレージにコピーしたいと考えています。私の提案は4つの部分です:

  1. 一時的に Android に空のデータベースを作成させ、それがどこに配置されているかを把握します。
  2. その場所にコピーするように copyDatabase コードを変更します。
  3. onCreate をオーバーライドして copyDatabase を呼び出します。Android はデータベースが存在しない場合にのみ onCreate を呼び出すため、無条件に copyDatabase を呼び出すことができます。
  4. 今後、スキーマを変更する場合は、onUpgrade で処理してください。

それだけです。これをどのように進めているか教えてください。

1 つの注意点: 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 に答える