0

私はAndroid sqliteデータベースにあまり詳しくありません。私はsqliteデータベースにデータを入力するという大まかな考えしか持っていません。私はいくつかのチュートリアルに従いましたが、それらは異なることを伝えています。Android プロジェクトがあり、そのパッケージの 1 つが .db です。このパッケージは 5 つの異なるクラスで構成されています。彼らです:

  1. DataAdapter.java
  2. データベースヘルパー.java
  3. DBAdapter.java
  4. LoadDBActivity.java
  5. SelectDBAdapter.java

データベースからデータを選択するために SelectDBAdapter クラスが使用されることは知っています。私のデータベースは、.jpeg 形式のアセット フォルダーにあります。sqliteBrowser から開くことができます。実際、私が知りたいのは、なぜこれらの異なるクラスを使用する必要があるのですか? そして、それぞれのクラスの目的は何ですか?

このプロジェクトは別の人 (私の友人) のものであるため、コードを投稿できません。これらの異なるクラスを使用する意味と、なぜそのようなシナリオを使用する必要があるのか​​ を説明できるほど親切な人がいれば、私は非常に義務付けられています。

4

2 に答える 2

3

私の開発経験から、準備された sqlite データベース ファイルを /res/raw フォルダーに追加することを常に好みます。Firefox の Sqlite Manager アドオンを使用して sqlite データベースを作成/管理します。これは優れたツールです。この方法は本当に素晴らしいので

  • まず、データベースを作成/管理するためのコードをたくさん書く必要はありません。
  • 最も重要なことは、一部のアプリケーションは、事前入力されたデータベースから読み取る必要があることです。アプリが必要とするものや、データベースが空か既にいっぱいかを気にする必要はありません。それはすべての目的を果たします。必要な単純な sql を実行するメソッドをいくつか書くだけです。

これは、独自にカスタマイズした DatabaseHelper クラスです。このクラスを使用するには、いくつかの指示に従う必要があります。

  1. sqlite データベースのサイズが 1MB を超える場合は、ファイルをチャンクに分割します。私は 512KB のチャンクを好み、それらを /res/raw ディレクトリに配置します。
  2. 次のクラスでパッケージ名と db ファイル名を編集します。

    package your.packagee.name;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import android.content.Context;
    import android.content.res.Resources;
    import android.database.Cursor;
    import android.database.SQLException;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteException;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.util.Log;
    import android.widget.Toast;
    
    public class DataBaseHelper extends SQLiteOpenHelper {
    
    private static final String pkg = "your package name";
    private static String DB_PATH = "/data/data/" + pkg + "/databases/";
    
    private static String DB_NAME = "yourDBFile.sqlite";
    int[] dbfiles = { R.raw.chunk1 , R.raw.chunk2 ..... };
    
     private SQLiteDatabase myDataBase;
    private final Context myContext;
    
    public DataBaseHelper(Context context) {
        super(context, DB_NAME, null, 1);
        this.myContext = context;
    }
    
    public void createDataBase() {
    
        boolean dbExist = checkDataBase();
    
        if (dbExist) {
            // do nothing - database already exist
        } else {
            this.getReadableDatabase();
            try {
                CopyDataBase();
            } catch (IOException e) {
                Toast.makeText(myContext, e.getMessage(), Toast.LENGTH_SHORT)
                        .show();
                Log.d("Create DB", e.getMessage());
            }
        }
    
    }
    
    private boolean checkDataBase() {
        SQLiteDatabase checkDB = null;
        try {
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.NO_LOCALIZED_COLLATORS);
        } catch (SQLiteException e) {
            Toast.makeText(myContext, e.getMessage(), Toast.LENGTH_SHORT)
                    .show();
            Log.d("Check DB", e.getMessage());
        }
    
        if (checkDB != null) {
            checkDB.close();
        }
        return checkDB != null ? true : false;
    }
    
    private void CopyDataBase() throws IOException {
        InputStream databaseInput = null;
        Resources resources = myContext.getResources();
        String outFileName = DB_PATH + DB_NAME;
    
        OutputStream databaseOutput = new FileOutputStream(outFileName);
    
        byte[] buffer = new byte[512];
        int length;
    
        for (int i = 0; i < dbfiles.length; i++) {
            databaseInput = resources.openRawResource(dbfiles[i]);
            while ((length = databaseInput.read(buffer)) > 0) {
                databaseOutput.write(buffer, 0, length);
                databaseOutput.flush();
            }
            databaseInput.close();
        }
    
        databaseOutput.flush();
        databaseOutput.close();
    }
    
    public void openDataBase() throws SQLException {
        String myPath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.NO_LOCALIZED_COLLATORS);
    }
    
    @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) {
    
    }
    
    public boolean deleteItem (String ID){
    
        String query = "delete from item where id='" + ID + "'"  ;
        Log.d("Query : ", query);
        try{
            myDataBase.execSQL(query);
            return true ;
        } catch (Exception e){
            Log.d("Exception", e.toString());
            return false ;
        }
    }
    
    public Cursor getSearchFromID(String id) {
        return myDataBase.rawQuery("select * from item where id = \"" + id + "\"", null);
    }
    
    public boolean addSave(String type, String data , String time) {
    
        String query = "insert into item (type, data , timestamp) values ('" + type
        + "', '" + data + "', '" + time + "')"; 
    try {
       myDataBase.execSQL(query);
       return true ;
    } catch (Exception e) {
       return false ;
    }
    }
    }
    

サンプルとして書かれたいくつかのメソッドとその使用方法を次に示します。

使い方は簡単です。アプリケーションが起動すると、ランチャーアクティビティでこのコードを使用してデータベースを初期化することを意味します

DataBaseHelper helper = new DataBaseHelper(this);
helper.createDataBase();
helper.openDataBase();
helper.close();

次に、DatabaseHelper クラスに記述されたメソッドを使用します。サンプルはこのようになります

 String id = "1";
    DataBaseHelper helper = new DataBaseHelper(this);
    helper.openDataBase();
    Cursor c = helper.getSearchFromID(id);
    if(c.getCount() > 0){
        c.moveToFirst();

      while(!c.isAfterLast()){
        // extract your data from cursor
        c.MoveToNext();
      }
    }

Android の sqlite データベースに関するすべての問題が解決されることを願っています。少なくとも私にとっては解決しました。ありがとうございました。

于 2013-10-09T04:41:22.450 に答える
0

データベースの作成にはさまざまな方法があります。私がしていることはinsert(ObjectType objectName)、DBAdapter クラスで を作成することです。そうは言っても、オブジェクト クラスを作成します。この例では、承認された人員を使用します。

public class AuthorizedPersonnelClass {

  private String _id;
  private String Last_Name;
  private String Middle_Name;
  private String First_Name;
  private String Store_ID;
  private String Status;
  private String New_Personnel;

      //of course insert your 2 constructors and getter setter methods here
}

DBAdapter でinsert(AuthorizedPersonnelClass authorizedPersonnel)、データの挿入を処理するメソッドを作成します。

public long addPersonnel(AuthorizedPersonnelClass authorizedPersonnel){
    ContentValues values = new ContentValues();

    values.put(AUTHORIZEDPERSONNEL_ID, authorizedPersonnel.get_id());
    values.put(L_NAME_AUTHORIZED_PERSONNEL, authorizedPersonnel.getLast_Name());
    values.put(M_NAME_AUTHORIZED_PERSONNEL, authorizedPersonnel.getMiddle_Name());
    values.put(F_NAME_AUTHORIZED_PERSONNEL, authorizedPersonnel.getFirst_Name());
    values.put(STATUS, authorizedPersonnel.getStatus());
    values.put(STORE_ID, authorizedPersonnel.getStore_ID());
    values.put(NEW, authorizedPersonnel.getNew_Personnel());

    return this.mDB.insert(TABLE_AUTHORIZED_PERSONNEL, null, values);
}

onCreate()そして、そこから、関数またはボタン呼び出しにエントリを入力したいとしましょう。次のようにします。

//instantiate a global variable for the DBAdapter
DBAdapter db = new DBAdapter(this);

//then if you want to insert 
db.insert(new AuthorizedPersonnelClass( /*insert variables here*/ ));

もちろん、これらの値はハードコードまたはユーザー入力の場合があります (EditTexts を使用して文字列を抽出し、そこで使用するだけです)。

ここでは、ContentValues混乱を招く可能性のある rawQuery Insert ステートメントを実行するのではなく、初心者にとって使いやすいため、この例を使用しました。

于 2013-10-09T04:28:50.770 に答える