gpt4 book ai didi

Android:未处理带有选择 WHERE 子句的 SQLite 查询

转载 作者:搜寻专家 更新时间:2023-11-01 09:06:39 25 4
gpt4 key购买 nike

我试图通过在ContentResolver 查询的selection 字符串中定义SQL WHERE 子句来限制数据库结果。

Cursor cursor = getContentResolver().query(uri, null, getSelectionString(), null, null);

...

public String getSelectionString() {
// TODO Replace latitude and longitude with database reference.
StringBuilder string = new StringBuilder();
string.append("latitude >= ").append(northEast.getLatitudeE6() / 1e6);
string.append(" AND ");
string.append("latitude <= ").append(southWest.getLatitudeE6() / 1e6);
string.append(" AND ");
string.append("longitude >= ").append(southWest.getLongitudeE6() / 1e6);
string.append(" AND ");
string.append("longitude <= ").append(northEast.getLongitudeE6() / 1e6);
return string.toString();
}

数据库列定义如下...

public class CustomDatabase {
public static final class Contract {
public static final String COLUMN_NAME = "name";
public static final String COLUMN_LATITUDE = "latitude";
public static final String COLUMN_LONGITUDE = "longitude";
}
}

...

我不是特别确定我可以检查游标中发送的查询。如果是这样,它不包含我发送的 WHERE 子句:

SQLiteQuery: SELECT * FROM custom_db ORDER BY number ASC

这里是选择字符串的例子:

latitude >= 48.203927 AND latitude <= 48.213851 AND longitude >= 16.36735 AND longitude <= 16.377648

问题:

  1. WHERE 子句在句法上是否正确?
  2. 我需要撇号吗?
  3. 我是否被迫在查询中同时使用两个参数(selection、selectionArgs)?
  4. 在哪里可以调试整个查询?

编辑:

这是 ContentProviderquery() 方法 ...

public class CustomProvider extends ContentProvider {

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
switch (URI_MATCHER.match(uri)) {
case URI_CODE_LOCATIONS:
return mCustomDatabase.getLocations();
}
return null;
}

... 显然,如 biegleux猜对了,忘记传参数了。呸!
这是数据库方法的当前实现...

public class CustomSQLiteOpenHelper extends SQLiteOpenHelper {

public Cursor getLocation() {
return mDatabaseHelper.getReadableDatabase().query(
CustomSQLiteOpenHelper.TABLE_NAME,
null, null, null, null, null, null);
}

您是否建议我将方法签名更改为以下以传递所有参数?我不会以这种方式暴露很多数据库接口(interface)吗?

public Cursor getLocations(String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) {
return mDatabaseHelper.getReadableDatabase().query(
CustomSQLiteOpenHelper.TABLE_NAME,
columns, selection, selectionArgs, groupBy, having, orderBy);
}

最佳答案

好的,看来您的提供商的 query() 方法导致了问题。确保它看起来像下面这样。

@Override
public abstract Cursor query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
...

// run the query
db.query(db, projection, selection, selectionArgs, groupBy, having, sortOrder, limit);

您不是被迫使用selectionArgs 参数,但代码可读性更强。要调试查询,您可以使用

SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
Log.e(TAG, qb.buildQuery(projection, selection, selectionArgs, groupBy, having, sortOrder, limit);

编辑:如果您实现了 ContentProvider,则无需公开 getLocations() 方法,因为您/用户可以使用 ContentProvider 的 query( ) 方法。您应该至少传递那些可以在 query() 方法中传递的参数,这些参数是 projectionselectionselectionArgssortOrder

关于Android:未处理带有选择 WHERE 子句的 SQLite 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11483831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com