タスクマネージャーを作成しています。タスクリストがあり、空の場合は特定のタスクリスト名をクリックして、タスクの追加アクティビティに進みますが、2つまたは3つのタスクがある場合は、それらのタスクリストをリスト形式で表示します。
リストのカウントを取得しようとしています。私のデータベースクエリは次のようなものです:
public Cursor getTaskCount(long tasklist_Id) {
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor= db.rawQuery("SELECT COUNT (*) FROM " + TABLE_TODOTASK + " WHERE " + KEY_TASK_TASKLISTID + "=?",
new String[] { String.valueOf(tasklist_Id) });
if(cursor!=null && cursor.getCount()!=0)
cursor.moveToNext();
return cursor;
}
私の活動:
list_tasklistname.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0,
Android.view.View v, int position, long id) {
db = new TodoTask_Database(getApplicationContext());
Cursor c = db.getTaskCount(id);
System.out.println(c.getCount());
if(c.getCount()>0) {
System.out.println(c);
Intent taskListID = new Intent(getApplicationContext(), AddTask_List.class);
task = adapter.getItem(position);
int taskList_id = task.getTaskListId();
taskListID.putExtra("TaskList_ID", taskList_id);
startActivity(taskListID);
}
else {
Intent addTask = new Intent(getApplicationContext(), Add_Task.class);
startActivity(addTask);
}
}
});
db.close();
}
しかし、タスクリスト名をクリックすると、1のボット番号が返されます。
DatabaseUtils.queryNumEntries()
を使用:
public long getProfilesCount() {
SQLiteDatabase db = this.getReadableDatabase();
long count = DatabaseUtils.queryNumEntries(db, TABLE_NAME);
db.close();
return count;
}
または(より非効率的)
public int getProfilesCount() {
String countQuery = "SELECT * FROM " + TABLE_NAME;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
int count = cursor.getCount();
cursor.close();
return count;
}
活動中:
int profile_counts = db.getProfilesCount();
db.close();
Android.database.DatabaseUtils を使用して、カウント数を取得します。
public long getTaskCount(long tasklist_Id) {
return DatabaseUtils.queryNumEntries(readableDatabase, TABLE_NAME);
}
データベース操作を実現するための複数のラッパーメソッドを持つ簡単なユーティリティです。
c.getCount()
は、カーソルに単一の行(実際のCOUNT(*)
を持つ行)が含まれているため、1
を返します。必要なカウントは、カーソルの最初の行のint
値です。
public int getTaskCount(long tasklist_Id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor= db.rawQuery(
"SELECT COUNT (*) FROM " + TABLE_TODOTASK + " WHERE " + KEY_TASK_TASKLISTID + "=?",
new String[] { String.valueOf(tasklist_Id) }
);
int count = 0;
if(null != cursor)
if(cursor.getCount() > 0){
cursor.moveToFirst();
count = cursor.getInt(0);
}
cursor.close();
}
db.close();
return count;
}
私はそれがずっと前に回答されたことを知っていますが、これも共有したいと思います:
このコードは非常にうまく機能します。
SQLiteDatabase db = this.getReadableDatabase();
long taskCount = DatabaseUtils.queryNumEntries(db, TABLE_TODOTASK);
しかし、すべての行をカウントしたくなく、適用する条件がある場合はどうなりますか?
DatabaseUtilsには、このための別の関数があります:DatabaseUtils.longForQuery
long taskCount = DatabaseUtils.longForQuery(db, "SELECT COUNT (*) FROM " + TABLE_TODOTASK + " WHERE " + KEY_TASK_TASKLISTID + "=?",
new String[] { String.valueOf(tasklist_Id) });
longForQuery
ドキュメントには次のように書かれています:
Dbでクエリを実行し、最初の行の最初の列に値を返すユーティリティメソッド。
public static long longForQuery(SQLiteDatabase db, String query, String[] selectionArgs)
パフォーマンスに優しく、いくつかのtimeと定型コードを節約できます
これがいつか誰かを助けることを願っています:)
そのテーブルの行数についてテーブルをクエリするには、クエリを可能な限り効率的にする必要があります。 参照 。
次のようなものを使用します。
/**
* Query the Number of Entries in a Sqlite Table
* */
public long QueryNumEntries()
{
SQLiteDatabase db = this.getReadableDatabase();
return DatabaseUtils.queryNumEntries(db, "table_name");
}
GetTaskCountメソッドを次のように変更します。
public int getTaskCount(long tasklist_id){
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor= db.rawQuery("SELECT COUNT (*) FROM " + TABLE_TODOTASK + " WHERE " + KEY_TASK_TASKLISTID + "=?", new String[] { String.valueOf(tasklist_id) });
cursor.moveToFirst();
int count= cursor.getInt(0);
cursor.close();
return count;
}
次に、クリックハンドラーを適宜更新します。
public void onItemClick(AdapterView<?> arg0, Android.view.View v, int position, long id) {
db = new TodoTask_Database(getApplicationContext());
// Get task list id
int tasklistid = adapter.getItem(position).getTaskListId();
if(db.getTaskCount(tasklistid) > 0) {
System.out.println(c);
Intent taskListID = new Intent(getApplicationContext(), AddTask_List.class);
taskListID.putExtra("TaskList_ID", tasklistid);
startActivity(taskListID);
} else {
Intent addTask = new Intent(getApplicationContext(), Add_Task.class);
startActivity(addTask);
}
}
DatabaseUtils.queryNumEntries()が何をするのかわかりますか?それはひどいです!これを使用します。
public int getRowNumberByArgs(Object... args) {
String where = compileWhere(args);
String raw = String.format("SELECT count(*) FROM %s WHERE %s;", TABLE_NAME, where);
Cursor c = getWriteableDatabase().rawQuery(raw, null);
try {
return (c.moveToFirst()) ? c.getInt(0) : 0;
} finally {
c.close();
}
}
カーソルを取得したら、次のことができます
Cursor.getCount()
行カウントを取得するのはとても簡単です:
cursor = dbObj.rawQuery("select count(*) from TABLE where COLUMN_NAME = '1' ", null);
cursor.moveToFirst();
String count = cursor.getString(cursor.getColumnIndex(cursor.getColumnName(0)));