java - 如何在 SQL 资源查询中使用格式字符串

标签 java android string format resources

我在代码中有一些字符串常量。我可以将所有这些放入资源 strings.xml 中吗?我认为单独使用列名的可能性仍然存在。有必要在以后对数据库的请求中搜索帖子索引。不使用索引,数字会令人困惑、不舒服。

private static final String NAME_DB = "cars.db";
private static final String TABLE_NAME = "cars";

private static final String COL_BRAND = "brand";
private static final String COL_MODEL = "model";
private static final String COL_COLOR = "color";
private static final String COL_MAX_SPEED = "max_speed";
private static final String COL_ENGINE_POWER = "engine_power";

private static final String CREATE_TABLE =
        "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" +
                "id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," +
                COL_BRAND + " TEXT NOT NULL, " +
                COL_MODEL + " TEXT NOT NULL, " +
                COL_COLOR + " TEXT, " +
                COL_MAX_SPEED + " INTEGER," +
                COL_ENGINE_POWER + " INTEGER)";


private static final String INSERT_DEFAULT_VALUES =
        "INSERT INTO " + TABLE_NAME + "(brand, model, color, max_speed, engine_power) VALUES" +
                "('Audi', 'Q7 II', 'White', 233, 252)," +
                "('Acura', 'ZDX', 'Black', 241, 300)," +
                "('BMW', 'X1 I', 'Blue', 205, 204)," +
                "('Hyundai', 'Solaris', 'Red', 100, 100)," +
                "('Hyundai', 'Tucson', 'Gray', 150, 177)," +
                "('BMW', '8 G14', 'Black', 250, 320)";

private static final String SELECT_ALL = "SELECT * FROM " + TABLE_NAME;
private static final String SELECT_TOP_1 = "SELECT * FROM " + TABLE_NAME + " LIMIT 1";

示例代码

DatabaseAdapter(Context context) {
    db = context.openOrCreateDatabase(NAME_DB, MODE_PRIVATE, null);
    db.execSQL(CREATE_TABLE);
    Cursor cursor = db.rawQuery(SELECT_TOP_1, null);

    if (!cursor.moveToFirst()) {
        db.execSQL(INSERT_DEFAULT_VALUES);
    }
}

String[] selectAll() {
    Cursor cursor = db.rawQuery(SELECT_ALL, null);
    if (!cursor.moveToFirst()) {
        return null;
    }

    ArrayList<String> list = new ArrayList<>();
    while (cursor.moveToNext()) {
        list.add(
                cursor.getString(cursor.getColumnIndex(COL_BRAND)) + " " +
                        cursor.getString(cursor.getColumnIndex(COL_MODEL)) + " " +
                        cursor.getString(cursor.getColumnIndex(COL_COLOR)) + " " +
                        cursor.getString(cursor.getColumnIndex(COL_MAX_SPEED)) + " " +
                        cursor.getString(cursor.getColumnIndex(COL_ENGINE_POWER))
        );
    }

    return list.toArray(new String[0]);
}

最佳答案

有一些使用 XML 中的 SQL 的解决方案。看看您是否可以使用其中之一。

但是恕我直言最好集中代码并将文本保留在那里,甚至不需要常量。

单独关注点:数据库查询和结果对象。这可以通过提供低级结果集对象的 Stream 来完成,使用类可以映射到它们自己的类。 解耦类;保持各层分离。 (在 Android 上可能没那么有趣。) 使用代码变得非常紧凑,查询在其他地方。

我的论点:

  • 减少来回跳转到不同来源的次数
  • 更好的可读性
  • 列名称不变
  • 常量大写的可读性较差
  • 将代码放在一起可以防止类似的查询在无人值守的情况下传播

但是,在更高级别的业务代码中,它仍然比 SQL 更好,将 SQL 隔离在 XML 中,以在其他地方获得更小的源和查询。所以至少要这样做。

Java - Storing SQL statements in an external file

关于java - 如何在 SQL 资源查询中使用格式字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58451873/

相关文章:

java - Java 6 中的空枚举

Java : Android ; 'The literal 08 of type int is out of range'

android - 如何将用户重定向到 Market 中的特定应用程序?

arrays - 轻松将xml中的字符串更改为xml中的数组

java - UNIX 时间戳到日期时间与 MS SQL 不一致

java - 与处理中播放的动画相比,最终渲染的视频速度加快

javascript - 使用 PhoneGap/Cordova 时的数据管理/计算

python - 如何按原样、反转和一次比较一个字符来比较两个两位数整数

javascript - 搜索(正则表达式),获取匹配字符串的最后一个字符的位置

java - Android .aar 库接口(interface)参数名称丢失