android命令sqlite表

android命令sqlite表

我有一个名为person的表,它包含两个字段,名称(TEXT)和年龄(INT)。我想按字母顺序对该表进行排序,但似乎可以使sql语句正常工作。我正在使用的语句是:

SELECT name FROM person ORDER BY name;


我尝试了三种不同的编码版本,但均无法正常工作。

db.rawQuery("SELECT name FROM person ORDER BY name;", null);
db.execSQL("SELECT name FROM person ORDER BY name;", null);
db.execSQL("SELECT name FROM person ORDER BY name;");


rawQuery绝对不执行任何操作,在LogCat中不显示任何消息。第一个execSQL崩溃,原因是:

java.lang.IllegalArgumentException: Empty bindArgs


第二个execsql崩溃:

android.database.sqlite.SQLiteException: unknown error: Queries cannot be performed using execSQL(), use query() instead.


我也尝试过使用query(),但无法做出正面或反面。请帮助。

最佳答案

尝试:

db.query("person", new String[] {"name"}, null, null, null, null, "name");


根据参考:

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


例如,如果您想要姓名和年龄,则可以使用:

db.query("person", new String[] {"name", "age"}, null, null, null, null, "name");


如果您只想选择其中带有“ woody”的名称,则可以使用:

db.query("person", new String[] {"name"}, "name=?", new String[] { "woody" }, null, null, "name");


为了处理结果,您可以执行以下操作:

Cursor c = db.query("person", new String[] {"name", "age"}, null, null, null, null, "name");

startManagingCursor(c);
int nameColumn = c.getColumnIndex("name");
int ageColumn = c.getColumnIndex("age");
c.moveToFirst())
do
{
    // Perform Logic
    Log.i('TEST INFO', 'Name: '.c.getString(nameColumn).' Age: '.c.getInt(ageColumn));
}
while (c.moveToNext());


根据评论修改:我不太确定为什么要对数据库中的数据重新排序,但是下面的函数应该做您想做的,您可能需要修改为套件,它将获得所有条目(有序) ,创建一个临时表,添加条目,删除真实表并重命名临时表以再次成为主表:

这样做非常耗费资源-使用正确布局的SQL SELECT语句对结果进行排序(因为它们是从数据库中收集的),因此所用的时间要少得多。

private void orderDB()
{
    Cursor c = db.query("person", new String[] {"name", "age"}, null, null, null, null, "name");
    startManagingCursor(c);

    //Create a temp table:
    db.execSQL("CREATE TABLE IF NOT EXISTS tmp_person (_id integer primary key autoincrement, "
        + "name text not null, "
        + "age integer);");

    // Get column ID's
    int nameColumn = c.getColumnIndex("name");
    int ageColumn = c.getColumnIndex("age");

    // Iterate through all entries
    c.moveToFirst();
    do
    {
        if (c.getCount() >0)
        {
            ContentValues orderedValues = new ContentValues();
            orderedValues.put("name", c.getString(nameColumn));
            orderedValues.put("age", c.getInt(ageColumn));
            try
            {
                // Insert the entry into a temp table
                db.insert("tmp_person", null, orderedValues);
            }
            catch (SQLException e)
            {
                Log.e("TEST INFO", e.toString());
            }
        }
    }
    while (c.moveToNext());

    // Drop the current person table:
    db.execSQL("DROP TABLE IF EXISTS person");

    // Rename the temp table to person:
    db.execSQL("ALTER TABLE tmp_person RENAME TO person");
}

关于android - android命令sqlite表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3980750/

10-12 05:31