6

私のSQLiteデータベースマネージャーでは、これをクエリできます:

SELECT SUM(odometer) as odometer FROM tripmileagetable where date like '2012-07%';

このクエリは、2012年7月の「tripmileagetable」という名前のテーブルから走行距離計の合計を返しますが、Androidクエリでこのコードを記述したいと思います。

しかし、database.query()メソッドでこのクエリを確立する方法がわかりません。誰か助けてもらえますか?

4

5 に答える 5

18
final Cursor cursor = db.rawQuery("SELECT SUM(odometer) as odometer FROM tripmileagetable where date like '2012-07%';", null);
int sum = 0;
if (cursor != null) {
    try {
        if (cursor.moveToFirst()) {
            sum = cursor.getInt(0);
        }
    } finally {
        cursor.close();
    }
}
于 2012-07-11T20:30:57.943 に答える
2

これは、Androidでデータベースにアクセスする方法によって異なります。次のようなことを試してみてください。

SQLiteDatabase db = this.getWritableDatabase();
String selectQuery = "select sum(odometer) as odometer from tripmileagetable where date like '2012-07%'";
Cursor cursor = db.rawQuery(selectQuery, null);

上記は、SQLiteOpenHelperクラスを使用している場合に使用されます。

データベースファイルを自分で作成した場合は、次のようにすることができます。

SQLiteDatabase db = SQLiteDatabase.openDatabase("/data/data/com.package.name/databases/dbname.db", null, SQLiteDatabase.OPEN_READWRITE);
String selectQuery = "select sum(odometer) as odometer from tripmileagetable where date like '2012-07%'";
Cursor cursor = db.rawQuery(selectQuery, null);

SQLiteDatase、Cursor、およびSQLiteOpenHelperについて調査します。

この例はあなたを助けるかもしれません:

https://github.com/nraboy/Spyfi/blob/master/Android/src/com/nraboy/spyfi/DataSource.java

于 2012-07-11T20:34:51.060 に答える
0

rawQueryメソッドを使用できます。

Cursor c = database.rawQuery("SELECT SUM(odometer) as odometer FROM tripmileagetable where date like '2012-07%'", null);
于 2012-07-11T20:27:30.797 に答える
0

フィールドがテーブルデータベースに作成されていません。テーブルのフィールドを確認してください。私は私の問題を見たからです。SQLiteAdministratorを使用してデータベースを表示しています。

または、お持ちでない場合は、createDatabaseのソースコードを確認してください。ソースコードが真であることを確認してください。そうすれば、ファイルエクスプローラーで古いデータベースを削除できます(つまり、Eclipseを使用して)。新しいデータベースで再度実行できます。

于 2012-07-16T08:52:12.887 に答える
0

AndroidはSQLiteDBを完全にサポートしています。アプリ内で作成するすべてのDBには、アプリのすべてのクラスからアクセスできます(アプリの外部ではありません!)。

まず、SQLiteOpenHelperを拡張するJavaクラスを作成する必要があります。ここでは、 onCreate( )メソッドとonUpdate()メソッドをオーバーライドする必要があります。想像できるように、前者はDBの作成時に呼び出され、後者はDBの変更時に呼び出されます。

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


/**
 * Class DatabaseHelper.
 */
public class DatabaseHelper extends SQLiteOpenHelper {
    //Database parameters:
    private static final String DATABASE_NAME = "dbname";  // the name of the DB!
    private static final int DATABASE_VERSION = 2;
    private static final String DATABASE_TABLE_NAME = "tripmileagetable";  // the name of the table!

    //Table attributes:
    private static final String DATABASE_TABLE_ATTR_ID = "id";  // attr1
    private static final String DATABASE_TABLE_ATTR_ODOMETER = "odometer";  // attr2
    private static final String DATABASE_TABLE_ATTR_DATE = "date";  // attr3


    /**
     * Class constructor.
     *
     * @param context  the context.
     */
    DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }


    @Override
    public void onCreate(SQLiteDatabase db) {
        String create = "CREATE TABLE " + DATABASE_TABLE_NAME + " (" +
                        DATABASE_TABLE_ATTR_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                        DATABASE_TABLE_ATTR_ODOMETER + " INTEGER, " +
                        DATABASE_TABLE_ATTR_DATE + " TEXT);";

        db.execSQL( create );
    }


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_NAME);
        onCreate(db);
    }
}

これで、新しいJavaクラス内で、DBを照会するためのカスタムメソッドを作成できます。

DBを作成するには、getWritableDatabase()を使用する必要がありますが、DBを読み取るには、getReadableDatabase()を使用する必要があります。どちらもSQLiteDatabaseオブジェクトを返し、最終的にSQLiteExceptionをスローします。特に、DBをクエリするには、rawQueryquery(どちらもCursorオブジェクトを返します)の2つのSQLiteDatabaseメソッドを使用できます。

/**
 * Get the sum of the odometer of a particular month and year.
 *
 * @param year  the year.
 * @param month  the month.
 * @return the sum of the odometer of the year and the month.
 */
public int sumOdometer(Integer year, Integer month) {
    //Date composition:
    String date = year.toString() + "-" + month.toString() + "%";

    //SQL query:
    String query = "SELECT SUM(" + DATABASE_TABLE_ATTR_ODOMETER + ") AS " + DATABASE_TABLE_ATTR_ODOMETER + 
                   " FROM " + DATABASE_TABLE_NAME +
                   " WHERE " + DATABASE_TABLE_ATTR_DATE + "LIKE ?";

    //Execute the SQL query:
    SQLiteDatabase db = getReadableDatabase();
    Cursor cursor = db.rawQuery(query, new String [] {date});

    int sum = 0;
    if( cursor.moveToFirst() ) {  // moves the cursor to the first row in the result set...
        sum = cursor.getInt( cursor.getColumnIndex(DATABASE_TABLE_ATTR_ODOMETER) );
    }

    //Close the Cursor:
    cursor.close();

    return sum;
}

SQLiteは、引数(?)を自動的に一重引用符(')で囲んでいることに注意してください。

ここで良いチュートリアルを見つけることができます:http://www.codeproject.com/Articles/119293/Using-SQLite-Database-with-Android

于 2013-03-31T17:19:45.747 に答える