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.