我有一个名为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/