ラベル sqlite の投稿を表示しています。 すべての投稿を表示
ラベル sqlite の投稿を表示しています。 すべての投稿を表示

2014年7月16日水曜日

Android : SQLite で ORDER BY と LIMIT を使用する


このエントリーをはてなブックマークに追加
ORDER BY と LIMIT を使う場合は

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

を使用します。
orderBy句には "コラム名 ASC(もしくはDESC)"、でソートに使う列を、 limit句には "1" のように文字列の形で取得制限数を入れます。 以下は、一番古いエントリーの日付を取得する、というサンプルです。 (日付のエントリーとして使っている値は独自形式でただの int です。)
int getFirstRecord(long id){
    SQLiteDatabase db = getReadableDatabase();
    String[] columns = new String[]{ COLUMN_DATE };
    assert db != null;
    Cursor cursor = db.query(TABLE_NAME, columns,
            String.format("%s = %d", COLUMN_ID, id), null, null, null, String.format("%s ASC", COLUMN_DATE), "1");
    int dateEntryValue = -1;
    if(cursor.moveToNext()){
        dateEntryValue = cursor.getInt(0);
    }
    cursor.close();
    db.close();
    return dateEntryValue;
}

Android : SQLite でレコード数を調べる - COUNT を使用する


このエントリーをはてなブックマークに追加
SUM, TOTAL の場合と同じく、rawQuery を使用して1行1列の Cursor を取得し、その結果を cursor.getInt(0) で取得する、という流れです。以下サンプル。SQLiteOpenHelper 内を想定して getReadableDatabase() を使っています。


int getRecordCount(long id){
    SQLiteDatabase db = getReadableDatabase();
    Cursor cursor = db.rawQuery(
        String.format("SELECT COUNT(*) FROM %s WHERE %s = %d", TABLE_NAME, COLUMN_ID, id), null);
    int count = 0;
    if(cursor.moveToNext()){
        count = cursor.getInt(0);
    }
    cursor.close();
    db.close();
    return count;
}

2014年7月15日火曜日

Android : SQLite で SUM (TOTAL) を使って合計を出す


このエントリーをはてなブックマークに追加
rawQuery を使うようですね。
rawQuery で SUM もしくは TOTAL を使った場合、行、列ともに 1 の Cursor が返ってくるそうです。
テーブル名の指定方法や WHERE 句を使うかは場合によりますが、
以下サンプルコードです。
(SQLiteOpenHelper を継承したクラス内を想定して getReadableDatabase() を使用しています。)

SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.rawQuery(
    String.format("SELECT SUM(%s) FROM %s WHERE %s = ? ",
    COLUMN_POINT, TABLE_NAME, COLUMN_ID), new String[]{ String.valueOf(id) });
int point = 0;
if(cursor.moveToNext()){
    point = cursor.getInt(0);
}
cursor.close();
db.close();

ちなみに SUM と TOTAL の違いは
  • カラムの値が NULL だけだった場合、SUM は NULL を返す。TOTAL は 0.0 を返す。
  • カラムの値が整数値のみだった場合、SUM は整数を返す。TOTAL は浮動小数点を返す。
という事らしいです。
cursor.getInt() は column の値が NULL だった場合 Exception を投げるような気がするので、NULL の可能性がある列で SUM を撮る場合は try catch で囲ったほうが良いのかもしれませんね。(そういう列で SUM を取っていないので未確認。)

参考 : Fetching a SQLite SUM in Java on Androidsum関数 / total関数

2012年10月20日土曜日

python - sqlite3 : テーブル一覧の取得


このエントリーをはてなブックマークに追加
sqlite_master から type="table" を select する
import sqlite3

conn = sqlite3.connect('sq.db')
cursor = conn.cursor()
cursor.execute('select * from sqlite_master WHERE type="table"')
for item in cursor.fetchall():
    print item