-1

私はアンドロイドのデータベースに不慣れです。データベースから NAME などの行 ID を取得する方法を知りたいです。私は少しのリサーチで以下を使用しましたが、今は表示部分に固執しています。

       public class DestinateurTable {

                public String TABLE_NAME="destinateur";

                public String ROW_ID="rowid";
                public String NAME="name";
                public String AGENCE="agence";
                public String EMAIL="email";



            }


        public class Destinataire { 


            public String rowid,name,agence,email;


        }


    **My DBHelper.class**


    public class DBHelper {

    private final String DATABASE_PATH = "/data/data/.../databases/";
    private final String DATABASE_NAME = "...sqlite";
    private final static int DATABASE_VERSION = 1;

    private Context context;
    private SQLiteDatabase database = null;
    OpenHelper openHelper=null;
    StringBuilder query =null;
    Cursor cursor=null;

    DestinateurTable destinataireTable = new DestinateurTable();

    public static DBHelper dbHelper = null;

    private DBHelper(Context context) {

    this.context = context;
    openHelper = new OpenHelper(this.context);
    this.database = openHelper.getWritableDatabase();

    try {

        createDataBase();
        openDataBase();

    } catch (IOException e) {

        e.printStackTrace();
    }

    }
    public static DBHelper getInstance(Context context)
    {
    if(dbHelper == null)
        dbHelper = new DBHelper(context);
    return dbHelper;
    }

   public void openDataBase() throws SQLException{

    //Open the database
    String myPath = DATABASE_PATH + DATABASE_NAME;
    database = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
    }

    /**
     * Creates a empty database on the system and rewrites it with your own database.
     * */
    public void createDataBase() throws IOException
    {
    openHelper.getReadableDatabase();
    if(getDBAlreadyCopiedToDeviceOnceFlag(context) == false){
        try {
        copyDataBase();
        setDBAlreadyCopiedToDeviceOnceFlag(context);
        } catch (IOException e) {
        e.printStackTrace();
        throw new Error("Error copying database");
        }
    }
    }

    /**
     * Check if the database already exist to avoid re-copying the file each time you open the application.
     * @return true if it exists, false if it doesn't
     */
    @SuppressWarnings("unused")
    private boolean checkDataBase(){

    SQLiteDatabase checkDB = null;

    try{
        String myPath = DATABASE_PATH + DATABASE_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);

    }catch(SQLiteException e){

        //database does't exist yet.

    }

    if(checkDB != null){

        checkDB.close();

    }

    return checkDB != null ? true : false;
    }

    /**
     * Copies your database from your local assets-folder to the just created empty database in the
     * system folder, from where it can be accessed and handled.
     * This is done by transfering bytestream.
     * */
    private void copyDataBase() throws IOException{

    //Open your local db as the input stream
    InputStream myInput = context.getAssets().open(DATABASE_NAME);

    // Path to the just created empty db
    String outFileName = DATABASE_PATH + DATABASE_NAME;

    //Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    //transfer bytes from the inputfile to the 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();

    }

    private class OpenHelper extends SQLiteOpenHelper
    {

        @SuppressWarnings("unused")
        SQLiteStatement insertStmt;

        public OpenHelper(Context context)
        {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @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
        }
    }


    public void setDBAlreadyCopiedToDeviceOnceFlag(Context ctx)
    {
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putBoolean("isDBAlreadyCopiedToDeviceOnce", true);
        editor.commit();
    }

    public boolean getDBAlreadyCopiedToDeviceOnceFlag(Context ctx)
    {
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
        boolean isDBAlreadyCopiedToDeviceOnce = prefs.getBoolean("isDBAlreadyCopiedToDeviceOnce", false);
        return isDBAlreadyCopiedToDeviceOnce; 
    }



    ////////////////////////////
    //// Write your methods here
    ////////////////////////////

    public ArrayList<Destinataire> getDestinataireList()
    {
        ArrayList<Destinataire> items=new ArrayList<Destinataire>();

        try
        {
            query = new StringBuilder();
            query.append("select * from "+destinataireTable.TABLE_NAME);

            cursor=this.database.rawQuery(query.toString(),null);
            if (cursor.moveToFirst())
            {
                do
                {
                    Destinataire d=new Destinataire();

                    d.rowid=cursor.getString(cursor.getColumnIndex(destinataireTable.ROW_ID));
                    d.name=cursor.getString(cursor.getColumnIndex(destinataireTable.NAME));
                    d.agence=cursor.getString(cursor.getColumnIndex(destinataireTable.AGENCE));
                    d.email=cursor.getString(cursor.getColumnIndex(destinataireTable.EMAIL));

                    items.add(d);

                }

                while (cursor.moveToNext());
            }
            if (cursor != null && !cursor.isClosed())
            {
            cursor.close();

            }
        }
        catch(SQLiteException e){

            e.printStackTrace();
            return null;
        }

        return items;
    }

    //--here
    public boolean addDestinataire(Destinataire d){
        this.database.beginTransaction();

        try{

            ContentValues contentValues=new ContentValues();

            contentValues.put(destinataireTable.ROW_ID, d.rowid);
            contentValues.put(destinataireTable.NAME, d.name);
            contentValues.put(destinataireTable.AGENCE, d.agence);
            contentValues.put(destinataireTable.EMAIL, d.email);

            this.database.insert(destinataireTable.TABLE_NAME,null,contentValues);

            this.database.setTransactionSuccessful();

        } catch(Exception e){

            e.printStackTrace();

            return false;

        }   finally{

            this.database.endTransaction();

        }

        return true;
    }


    public boolean deleteDestinataire(String id){

        try {

            String query="delete from " + destinataireTable.TABLE_NAME+" where "+destinataireTable.ROW_ID+"='"+id+"'";
            this.database.execSQL(query);
        }

        catch(SQLiteException e){
            e.printStackTrace();
            return false;
        }
        return true;
    }


}
4

1 に答える 1

0

データベース全体の操作は問題ないようです。あなたは今、データを表示したいと言っています。これを行う最も一般的な方法は、 Adapterに接続されているListViewを使用することです。アダプターを Cursor で直接使用できますが、既に List として取得しているため、ArrayAdapterを使用できます。

簡単なテストとして使用すると、その仕組みが理解できるようになります。新しいアクティビティを作成しextends ListActivity、次のコードを記述します。

public class MyListActivity extends ListActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         ArrayList<Destinataire> items = getDestinataireList();
         ArrayAdapter<Destinataire> adapter = new ArrayAdapter<Destinataire>(this, android.R.layout.simple_list_item_1 , android.R.id.text1, items)
         setListAdapter(adapter);
    }
}

Destinataire クラス内にも次の行を含めます。

@Override
public String toString() {
    return name + " " + agence + " " + email;
}

これは非常に基本的な例であり、最適化されていません (たとえば、バックグラウンド スレッドを使用して DB からデータをロードする必要があります) が、DB からの各項目を示すリストが表示されますname agence email

ハッピーコーディング!

編集:

この行:

new ArrayAdapter<Destinataire>(this, android.R.layout.simple_list_item_1 , android.R.id.text1, items)

...いくつかの重要な部分があるので、説明させてください:

  • ArrayAdapter: 配列内のオブジェクトに対して toString() を呼び出すのが標準的な動作です。この最初の部分を完了したら、CustomAdapter について学習して、より複雑な (楽しい) ものを作成できます。
  • this: ListActivity を参照しています。すべてのアクティビティは ContextWrapper を拡張します。つまり、アクティビティはデバイス リソースへの参照を保持します。アダプターがレイアウトを作成するために非常に重要です。
  • android.R.layout.simple_list_item_1: これは、1 行のテキストだけの標準的な Android レイアウトです。非常に単純ですが、簡単なテストに適しています。各アイテムにこのレイアウトを使用するようアダプターに指示しています。
  • android.R.id.text1: レイアウト内のテキストの ID です。レイアウトにその ID を持つ TextView があることをアダプタに伝えています。したがって、データ オブジェクトから toString() を取得し、TextView に設定します。
  • items: それはあなたのデータです。
于 2013-04-23T08:50:52.727 に答える