0

私はsqliteデータベース用のandroidsdkの情報とドキュメントを研究してきましたが、まだ少し行き詰まっています。ここにある例から取得したデータベースのクラスがあります。これは私のクラスです:

package com.example.medtracker;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;

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.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBAdapter {
    private static final String DATABASE_NAME = "meds.db";
    private String DATABASE_TABLE;
    private static final int DATABASE_VERSION = 1;

    // Index Key column
    public static final String KEY_ID = "_id";

    // Name of the column index of each column in DB
    public ArrayList<String> TABLE_KEYS = new ArrayList<String>();
    public ArrayList<String> TABLE_OPTIONS = new ArrayList<String>();
    public final String KEY_TIMESTAMP = "timeStamp";
    public final int TIMESTAMP_COLUMN = 1;

    // Create new database
    private String DATABASE_CREATE;

    // Variable to hold database instant
    private SQLiteDatabase db;

    // Database open/upgrade helper
    private myDBHelper dbHelper;

    public DBAdapter(Context context, String table, ArrayList<String> keys,
            ArrayList<String> options) {
        // Start initializing all of the variables
        DATABASE_TABLE = table;
        TABLE_KEYS = (ArrayList<String>) keys.clone();
        TABLE_OPTIONS = options;

        String keyString = "";
        for (int i = 0; TABLE_KEYS.size() > i; i++) {

            // Add commas to the options elements if there is a next value.
            if (i + 1 < TABLE_OPTIONS.size() && TABLE_OPTIONS.get(i) != null) {
                TABLE_OPTIONS.set(i, TABLE_OPTIONS.get(i) + ",");
            } else if (i + 1 == TABLE_OPTIONS.size()
                    && TABLE_OPTIONS.get(i) != null) {
                if (i + 1 < TABLE_KEYS.size()) {
                    TABLE_OPTIONS.set(i, TABLE_OPTIONS.get(i) + ",");
                } else {
                    TABLE_KEYS.set(i, TABLE_KEYS.get(i) + "");
                }
            } else if (i + 1 != TABLE_KEYS.size()) {
                TABLE_KEYS.set(i, TABLE_KEYS.get(i) + ",");
            } else {
                TABLE_KEYS.set(i, TABLE_KEYS.get(i) + "");
            }

            System.out.println(TABLE_OPTIONS.toString());
            System.out.println(TABLE_KEYS.toString());

            if (i + 1 <= TABLE_OPTIONS.size() && TABLE_OPTIONS.get(i) != null)
                keyString = keyString + " " + TABLE_KEYS.get(i) + " "
                        + TABLE_OPTIONS.get(i);
            else if (i + 1 > TABLE_OPTIONS.size()
                    || TABLE_OPTIONS.get(i) == null) {
                keyString = keyString + " " + TABLE_KEYS.get(i);
            }
        }

        // Create the database creation string.
        DATABASE_CREATE = "CREATE TABLE IF NOT EXISTS " + DATABASE_TABLE + " ("
                + "_id" + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                + KEY_TIMESTAMP + "," + keyString + ");";

        // Create a new Helper
        dbHelper = new myDBHelper(context, DATABASE_NAME, null,
                DATABASE_VERSION, DATABASE_TABLE, DATABASE_CREATE);
    }

    public DBAdapter open() throws SQLException {
        db = dbHelper.getWritableDatabase();
        return this;
    }

    public void close() {
        db.close();
    }

    public long insertEntry(ArrayList<String> key, ArrayList<String> value) {
        String timeStamp = new Timestamp(Calendar.getInstance()
                .getTimeInMillis()).toString();
        ContentValues contentValues = new ContentValues();
        for (int i = 0; key.size() > i; i++) {
            contentValues.put(key.get(i), value.get(i));
        }
        contentValues.put(KEY_TIMESTAMP, timeStamp);
        return db.insert(DATABASE_TABLE, null, contentValues);
    }

    public boolean removeEntry(long rowIndex) {
        return db.delete(DATABASE_TABLE, KEY_ID + "=" + rowIndex, null) > 0;
    }

    public Cursor getAllEntries(String[] columns, String selection,
            String[] selectionArgs, String groupBy, String having,
            String sortBy, String sortOption) {
        return db.query(DATABASE_TABLE, columns, selection, selectionArgs,
                groupBy, having, sortBy + " " + sortOption);
    }

    public int updateEntry(long rowIndex, ArrayList<String> key,
            ArrayList<String> value) {
        String timeStamp = new Timestamp(Calendar.getInstance()
                .getTimeInMillis()).toString();
        String where = KEY_ID + "=" + rowIndex;
        ContentValues contentValues = new ContentValues();
        for (int i = 0; key.size() > i; i++) {
            contentValues.put(key.get(i), value.get(i));
        }
        contentValues.put(KEY_TIMESTAMP, timeStamp);
        return db.update(DATABASE_TABLE, contentValues, where, null);
    }

    public boolean clearTable() {
        return db.delete(DATABASE_TABLE, null, null) > 0;
    }

    private static class myDBHelper extends SQLiteOpenHelper {
        private String creationString;
        private String tableName;
        @SuppressWarnings("unused")
        SQLiteDatabase db;

        /**
         * Creates a myDBHelper object.
         * 
         * @param context
         *            The context where the access is needed
         * @param name
         *            Name of database file
         * @param factory
         *            A CursorFactory, or null to use default CursorFactory
         * @param version
         *            Database version
         * @param tableName
         *            Name of table within database
         * @param creationString
         *            SQL String used to create the database
         */
        public myDBHelper(Context context, String name, CursorFactory factory,
                int version, String tableName, String creationString) {
            super(context, name, factory, version);
            this.creationString = creationString;
            this.tableName = tableName;
        }

        /**
         * Creates the database table.
         * 
         * @param db
         *            The database used by this helper to create the table in
         */
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(creationString);
        }

        /**
         * This method determines if the database needs to be updated or not.
         * 
         * @param db
         *            The database used by this helper
         * @param oldVersion
         *            The old database version
         * @param newVersion
         *            The new database version
         */
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // Log the version upgrade
            Log.w("TaskDBAdapter", "Upgrading from version " + oldVersion
                    + " to " + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS " + tableName);
            onCreate(db);

        }

        /**
         * Creates tables when the database is opened if the tables need to be
         * created.
         * 
         * @param db
         *            The database used by this helper
         */
        @Override
        public void onOpen(SQLiteDatabase db) {
            db.execSQL(creationString);
        }

    }
}

次に、オブジェクトを追加するクラスを作成しました。パブリッククラスAddMed extends Activityimplements OnClickListener {

Button submit;
    EditText name, dossage;
    DBAdapter database;
    String names, amount;
    String total;
    ArrayList<String> btr;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.addmed);
        submit = (Button) findViewById(R.id.bSubmit);
        name = (EditText) findViewById(R.id.etNameOfMed);
        dossage = (EditText) findViewById(R.id.etHowMuch);
    }

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        switch (arg0.getId()) {
        case R.id.bSubmit:
            names = name.getText().toString();
            amount = dossage.getText().toString();
            total = names + amount;
            btr.add(total);
            database.open();
            database.insertEntry(btr, btr);
            database.close();
            break;
        }
    }

}

次に、テキストビューを持つ別のクラスがあり、新しいDBAdatperインスタンスを作成し、カーソルからgetAllEntriesメソッドを使用しようとしましたが、パラメーターについて混乱しています。誰かが私を啓発できますか?ご協力ありがとうございました。

4

3 に答える 3

4

SQLLiteDatabase参照した例は、単にクラスのラッパーとして機能しようとしているようです。この例は、getAllEntriesの各パラメーターの目的を示しています。多くのパラメーターがあるように見えますが、結果セットをグループ化またはソートしたくない場合は、それらのいくつかがnullになる可能性があります。SQLLiteDatabase APIから取得した、各パラメーターの機能のリストを次に示します。

ここに画像の説明を入力してください

于 2013-01-02T22:48:47.257 に答える
1

あなたが見つけたチュートリアルは、あなたのために多くのことを自動的に行おうとしているクラスを提供します。あなたがそれを取得した場合は素晴らしいですが、そうでない場合はそれほど素晴らしいものではありません。

非常に複雑なこの例を削除し、代わりに、より適切なチュートリアルを使用して、最初から開始することをお勧めします。 http://www.vogella.com/には、SQLiteデータベースを含む優れたチュートリアルの大規模なコレクションがあります:SQLite

于 2013-01-02T22:44:02.873 に答える
0

クエリ用のSQLiteDatabaseドキュメントから

public Cursor query (String table, String[] columns, String selection, String[]
selectionArgs, String groupBy, String having, String orderBy, String limit)

Added in API level 1

Query the given table, returning a Cursor over the result set.

Parameters

table       The table name to compile the query against.

columns     A list of which columns to return. Passing null will return all
            columns, which is discouraged to prevent reading data from storage
            that isn't going to be used.

selection   A filter declaring which rows to return, formatted as an SQL WHERE
            clause (excluding the WHERE itself). Passing null will return all rows for
            the given table.

selectionArgs   You may include ?s in selection, which will be replaced by the
                values from selectionArgs, in order that they appear in the
                selection. The values will be bound as Strings.

groupBy     A filter declaring how to group rows, formatted as an SQL GROUP BY 
            clause (excluding the GROUP BY itself). Passing null will cause the rows
            to not be grouped.

having      A filter declare which row groups to include in the cursor, if row
            grouping is being used, formatted as an SQL HAVING clause (excluding the
            HAVING itself). Passing null will cause all row groups to be included,
            and is required when row grouping is not being used.

orderBy     How to order the rows, formatted as an SQL ORDER BY clause (excluding
            the ORDER BY itself). Passing null will use the default sort order, which
            may be unordered.

limit       Limits the number of rows returned by the query, formatted as LIMIT
            clause. Passing null denotes no LIMIT clause.

x、y、zという3つの列を持つtable1というテーブルがあるとします。そして、あなたは次のステートメントを実行したかった:

SELECT x,y FROM table1 WHERE x = 'squirrels' AND y = 'cats';

テーブルパラメータは、テーブルの名前( "table1")です。columnsパラメーターは、値を取得する対象の列(この場合、「x」列と「y」列)になります。選択パラメータは「x=?AND y =?」になります。selectionArgsパラメーターは、「squirrels」と「cats」を含む配列になります。そして、SQLを知っていれば、残りはかなり自明です。

于 2013-01-02T22:51:32.907 に答える