简体   繁体   中英

Android SQLite query optimization (ORM GreenDao)

My job is to maintain an application that is essentially a database for another application. the application uses ORM GreenDao. Here is StorageUtil.getResults method which processes queries:

public static JSONArray getResults(Database database, String query) {
        Cursor cursor = database.rawQuery(query, null);
        JSONArray resultSet = new JSONArray();
        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            int totalColumn = cursor.getColumnCount();
            JSONObject rowObject = new JSONObject();

            for (int i = 0; i < totalColumn; i++) {
                if (cursor.getColumnName(i) != null) {
                    try {
                        if (cursor.getString(i) != null) {
                            if (isJSONValid(cursor.getString(i))) {
                                try {
                                    JSONObject object = new JSONObject(cursor.getString(i));
                                    rowObject.put(cursor.getColumnName(i), object);
                                }catch (JSONException e){
                                    Logger.error(e);
                                }
                            } else {
                                rowObject.put(cursor.getColumnName(i), cursor.getString(i));
                            }
                        } else {
                            rowObject.put(cursor.getColumnName(i), "");
                        }
                    } catch (Exception e) {
                        Logger.error(e);
                    }
                }
            }
            resultSet.put(rowObject);
            cursor.moveToNext();
        }
        cursor.close();
        return resultSet;
    }

Here is code of one of my entities:

@Entity(nameInDb = "UI_SV_FIAS")
@Storage(description = "FIAS", table = "UI_SV_FIAS")
public class Fias {
    @Id
    public String LINK;

    @Property(nameInDb = "F_Street")
    public String F_Street;

    @Property(nameInDb = "C_Full_Address")
    @Index
    public String C_Full_Address;

    @Property(nameInDb = "C_House_Number")
    public String C_House_Number;

    @Property(nameInDb = "C_Building_Number")
    public String C_Building_Number;

    public Fias() {
    }

    @Generated(hash = 1534843169)
    public Fias(String LINK, String F_Street, String C_Full_Address,
            String C_House_Number, String C_Building_Number) {
        this.LINK = LINK;
        this.F_Street = F_Street;
        this.C_Full_Address = C_Full_Address;
        this.C_House_Number = C_House_Number;
        this.C_Building_Number = C_Building_Number;
    }

Problem: the table has about 2,500,000 rows and when I get a query, for example, like this one:

 http://localhost:8888/table?name=UI_SV_FIAS&query=select * from UI_SV_FIAS where C_Full_Address LIKE '%Чеченская%' ORDER BY C_House_Number, C_Full_Address limit 10

my app returns results in more then 10 seconds. But what I need is less then 3 seconds for such query. Does anyone have an idea how can I get that?

Try this:

public static JSONArray getResults(Database database, String query) {
        Cursor cursor = database.rawQuery(query, null);
        JSONArray resultSet = new JSONArray();
        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            int totalColumn = cursor.getColumnCount();
            JSONObject rowObject = new JSONObject();

            for (int i = 0; i < totalColumn; i++) {
                String columnName = cursor.getColumnName(i);
                if (columnName != null) {
                    try {
                        String columnValue = cursor.getString(i);
                        if (columnValue != null) {
                            if (isJSONValid(columnValue)) {
                                try {
                                    JSONObject object = new JSONObject(columnValue);
                                    rowObject.put(columnName, object);
                                }catch (JSONException e){
                                    Logger.error(e);
                                }
                            } else {
                                rowObject.put(columnName, columnValue);
                            }
                        } else {
                            rowObject.put(columnName, "");
                        }
                    } catch (Exception e) {
                        Logger.error(e);
                    }
                }
            }
            resultSet.put(rowObject);
            cursor.moveToNext();
        }
        cursor.close();
        return resultSet;
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM