java - 我可以减少代码重复,而不过度降低效率或引入开销吗?

标签 java sqlite android-cursor

我的问题集中在如何编写易于维护且高效的代码。更具体地说,它围绕着从 SQLite 游标获取数据。

当我第一次开始使用游标时,我会按照 mystrvar = curve.getString(?) 的方式进行硬编码,其中 ? 是相对于相应行的偏移量.

然后我开始使用与表列名称一起定义的常量。例如我会有类似的东西:-

// Table Aisles
    public static final String AISLES_TABLE_NAME = "aisles";
    public static final String AISLES_COLUMN_ID = PRIMARY_KEY_NAME;
    public static final String AISLES_COLUMN_ID_FULL = AISLES_TABLE_NAME + AISLES_COLUMN_ID;
    public static final int AISLES_COLUMN_ID_INDEX = 0; ........

并且,作为示例,将按照以下方式编写代码:-

mystrvar=cursor.getString(DBHelper.AISLES_COLUMN_ID_INDEX);

这是一个改进,但存在不擅长处理连接表的缺陷。

然后我意识到了 cursor.getColumnIndex(),但怀疑只是使用它。会有可以规避的管理费用。

我所做的是包含很少使用 getColumnIndex() 的代码。它仅在 Activity/自定义光标适配器中通过 getColumnIndex() 设置一次偏移量变量,然后使用相应的偏移量 变量,它是相应列的光标偏移量。

以下是一个示例(分为 3 个 block ,变量定义,第二个设置变量的方法,然后第三个,从游标中提取实际数据:-

1) 变量定义:-

public class Database_Inspector_AislesDB_Adapter extends CursorAdapter {

    // Variables to store aisles table offsets as obtained via the defined column names by
    // call to setAislesOffsets (aisles_aisleid_offset set -1 to act as notdone flag )
    public static int aisles_aisleid_offset = -1;
    public static int aisles_aislename_offset;
    public static int aisles_aisleorder_offset;
    public static int aisles_aisleshopref_offset;

    public Database_Inspector_AislesDB_Adapter(Context context, Cursor cursor, int flags) {
        super(context, cursor, 0);
        setAislesOffsets(cursor); //** Calls method to set offsets
    ........ 
}

2) 仅设置一次偏移量的方法(如果已经设置,则几乎立即返回)

    // Set Aisles Table query offsets into returned cursor, if not already set
    public void setAislesOffsets(Cursor cursor) {
        if(aisles_aisleid_offset != -1) {
            return;
        }
        aisles_aisleid_offset = cursor.getColumnIndex(ShopperDBHelper.AISLES_COLUMN_ID);
        aisles_aislename_offset = cursor.getColumnIndex(ShopperDBHelper.AISLES_COLUMN_NAME);
        aisles_aisleorder_offset = cursor.getColumnIndex(ShopperDBHelper.AISLES_COLUMN_ORDER);
        aisles_aisleshopref_offset = cursor.getColumnIndex(ShopperDBHelper.AISLES_COLUMN_SHOP);
    }

3)偏移量的使用示例

        textviewaisleid.setText(cursor.getString(aisles_aisleid_offset));
        textviewaislesaislename.setText(cursor.getString(aisles_aislename_offset));
        textviewaislesorder.setText(cursor.getString(aisles_aisleorder_offset));
        textviewaisleshopref.setText(cursor.getString(aisles_aisleshopref_offset));

但是,上述编码必须用于使用表 table 的每个 Activity/适配器。有 7 个表,56 列。连接表需要组合。有没有一种方法可以使用等效的全局变量(我假设使用共享首选项会产生更多的开销)。也就是说,我可以从任何地方设置一次偏移量,然后从任何地方访问它们(我的意思是从任何 Activity 或适配器中的任何地方)?重申一下,主要是为了减少维护开销/问题并考虑运行效率。

最佳答案

每个查询可以有不同的列索引,因此使用表列索引不是一个好主意。

getColumnIndex() 不存在性能问题,尤其是当您仅返回单行时。 (但为了避免对缺失或错误的列进行额外检查,如果可能的话,您应该使用 getColumnIndexOrThrow()。)

要减少输入量,请编写一个同时调用 getColumnIndexOrThrow()getString()/getXxx() 的辅助函数。

关于java - 我可以减少代码重复,而不过度降低效率或引入开销吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37724502/

相关文章:

java - NetBeans 永远是 "running..."并且不会编译

java - 获取到特定时间点的时间

java - 在 JSP/Spring 中禁用内容安全策略

Android:删除数据库中的特定行

android - 如何在Sqlite数据库中添加所有电话联系人?

java - Freemarker 中的可空日期

java - sqlite - 如何在Where子句中使用变量?

objective-c - NSData UIImageJPEGRepresentation 未写入 SQLite fmdb

两个日期之间的 Android 通话记录数据和来自同一号码的通话总时长。

Android - 从特定 Thread_ID 查询所有彩信和短信