2

私は現在、Android 用の SQLite アクセス チュートリアルに従っています。以下のように、サンプルの「DBAdapter」クラスが表示されます。

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBAdapter {
static final String KEY_ROWID = "_id";
static final String KEY_NAME = "name";
static final String KEY_EMAIL = "email";
static final String TAG = "DBAdapter";

static final String DATABASE_NAME = "MyDB";
static final String DATABASE_TABLE = "contacts";
static final int DATABASE_VERSION = 1;

static final String DATABASE_CREATE =
        "create table contacts (_id integer primary key autoincrement, "
        + "name text not null, email text not null);";

final Context context;
DatabaseHelper DBHelper;
SQLiteDatabase db;

public DBAdapter(Context ctx)
{
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
}

private static class DatabaseHelper extends SQLiteOpenHelper
{
    DatabaseHelper(Context context)
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
        try
        {
            db.execSQL(DATABASE_CREATE);
        }
        catch (SQLException ex)
        {
            ex.printStackTrace();
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS contacts");
        onCreate(db);
    }
}

//---opens the database---
public DBAdapter open() throws SQLException
{
    db = DBHelper.getWritableDatabase();
    return this;
}

//---closes the database---
public void close()
{
    DBHelper.close();       
}   

//---insert a contact into the database---
public long insertContact(String name, String email)
{
    ContentValues initialValues = new ContentValues();
    initialValues.put(KEY_NAME,  name);
    initialValues.put(KEY_EMAIL,  email);
    return db.insert(DATABASE_TABLE,  null,  initialValues);
}

//---deletes a particular contact---
public boolean deleteContact(long rowId)
{
    return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;        
}

//---retrieves all the contacts---
public Cursor getAllContacts()
{
    return db.query(DATABASE_TABLE,  new String[] {KEY_ROWID,  KEY_NAME,  KEY_EMAIL}, null, null, null, null, null);
}

//---retrieves a particular contact---
public Cursor getContact(long rowId) throws SQLException
{
    Cursor mCursor =
            db.query(true,  DATABASE_TABLE,  new String[] {KEY_ROWID,  KEY_NAME,  KEY_EMAIL}, KEY_ROWID + "="
                    + rowId, null, null, null, null, null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor;
}

//---updates a contact---
public boolean updateContact(long rowId, String name, String email)
{
    ContentValues args = new ContentValues();
    args.put(KEY_NAME,  name);
    args.put(KEY_EMAIL,  email);
    return db.update(DATABASE_TABLE,  args,  KEY_ROWID + "=" + rowId,  null) > 0;
}
}

このクラスを使用して連絡先を挿入したい場合は、次のように記述する必要があります。

DBAdapter db = new DBAdapter(this);
db.open();
long id = db.insertContact("name", "email");
db.close();

データベースにアクセスするには間違いなく多くの呼び出しを行う必要があるため、これはあまり冗長ではありません。静的クラスを作成しようとしましたが (そのため、インスタンス化する必要はありません)、できませんでした。DBAdapter クラスはコンテキスト (例:; this) で渡されることを期待しているためです。

dbClass.insertContact("name");や などの 1 行のコードでデータベース操作を実行できるクラスを作成したいと考えていますdbClass.getContacts();。クラスをインスタンス化したり、接続を開いたり、毎回接続を閉じたりしたくありませんが、これを静的関数で使用することはできません。誰でも私にアイデアを教えてもらえますか?

4

1 に答える 1

2

この方法は私にはうまくいきます。

データベースを開き、データベース オブジェクトへの参照を維持し、データベースを公開するDataHelperクラスを作成します。

public class CustomDataHelper {

private static final int DATABASE_VERSION = 30;
public SQLiteDatabase db = null;

public CustomDataHelper() {

    SQLiteOpenHelper o = new MyOpenHelper(CustomApp.app, "MyData.db");
    this.db = o.getWritableDatabase();

}

    // Rest of standard DataHelper class

private class MyOpenHelper extends SQLiteOpenHelper {

    MyOpenHelper(Context context,String DatabaseName) {
        super(context, DatabaseName, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
              // Standard data code here
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
              // Standard data code here
    }

}

}

Application クラスを拡張し、Data オブジェクトを静的フィールドとして格納します。Android.manifest を変更して、デフォルトのアプリ クラスの代わりにカスタム アプリ クラスを使用します。

public class CustomApp extends Application {

public static CustomDataHelper data; // Access the data class from anywhere

public static CustomApp app; // Access the application context from anywhere

@Override
public void onCreate() {
    super.onCreate();

    app = this;
    data = new CustomDataHelper();
}
}

データ アクセスを必要とするすべてのクラスは、このオブジェクトを参照して、開いているデータベースへの参照を取得できます。その後、関連するクラス内にすべてのデータ アクセス コードを配置できます。

たとえば、Contact クラスでは、Application クラスからデータベースを取得し、連絡先の詳細を保存するために必要なすべてのコマンドを実行する「Save」メソッドを使用できます。これにより、すべてのデータ アクセス コードが関連するクラスに保持されます。つまり、連絡先を変更するすべてのコードは、連絡先クラス内にあります。

public class contact {

    public void Save() {

        CustomApp.data.db.execSQL("Your SQL Here");
        // etc

    }

}

DataHelper は静的フィールドにあるため、いつでもどこからでもアクセスでき、アプリケーション クラスからの独自のコンテキストを既に持っています。

簡単にするために、上記ではエラー処理を除外していることに注意してください。

于 2013-06-21T12:09:57.113 に答える