大家好。
我正在尝试制作字典应用程序。
我尝试在我的"dic"
中复制名为"Dic_Openhelper"
的数据库。
我有一个名为"Dictionary"
的高管班。搜索结果将显示在此课程中。
我的问题是什么:
当我想执行"Dictionary"
课程时,需要花费大量时间才能加载。虽然在我的日食中显示了错误列表。但无论如何,课程将开始。
当然,这不是一个大问题,因为这些案例只是第一次执行"Dictionary"
课程,而且主要问题在这里。我的数据库有大约140000条记录。所以它是一个大数据库。当我搜索例如“发送”时,花了很多时间,大约2分钟后,它显示并制作了列表视图!当我尝试将这些鳕鱼用于小型数据库时,它运作良好。
我该怎么办?
我的"Dictionary"
和"Dic_openhelper"
班级:
package com.example.masaf;
import java.util.Locale;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Typeface;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class Dictionary extends Activity{
public ListView list;
public ImageView search;
public EditText et;
private TextView tv;
private Dic_openhelper db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dic);
et=(EditText) findViewById(R.id.dic_et);
tv=(TextView) findViewById(R.id.dic_tv);
list=(ListView) findViewById(R.id.dic_list);
search=(ImageView) findViewById(R.id.dic_img_search);
db=new Dic_openhelper(this);
db.database();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
search.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
showlist(et.getText().toString());
}
});
}
public void showlist(String w){
db.open();
int count=db.Count_serach(w);
String word[]=new String[count];
for(int i=0;i<count;i++){
word[i]=db.serach(i, 1, w);
}
db.close();
list.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1,word));
}
@Override
public void onBackPressed() {
finish();
startActivity(new Intent(Dictionary.this, Other.class));
}
}
我的“Dic_openhelper”课程:
package com.example.masaf;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
public class Dic_openhelper extends SQLiteOpenHelper {
public final String path="data/data/com.example.masaf/databases/";
public final String Name="dic";
public SQLiteDatabase mydb;
private final Context mycontext;
public Dic_openhelper(Context context) {
super(context, "dic", null, 1);
mycontext=context;
}
@Override
public void onCreate(SQLiteDatabase arg0) {
// TODO Auto-generated method stub
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
}
public void database(){
boolean checkdb=checkdb();
if(checkdb){
}else{
this.getReadableDatabase();
try{
copydatabase();
}catch(IOException e){
}
}
}
public void open(){
mydb=SQLiteDatabase.openDatabase(path+Name, null, SQLiteDatabase.OPEN_READWRITE);
}
public void close(){
mydb.close();
}
public boolean checkdb(){
SQLiteDatabase db=null;
try{
db=SQLiteDatabase.openDatabase(path+Name, null, SQLiteDatabase.OPEN_READONLY);
}
catch(SQLException e)
{
}
return db !=null ? true:false ;
}
public void copydatabase() throws IOException{
OutputStream myOutput = new FileOutputStream(path+Name);
byte[] buffer = new byte[1024];
int length;
InputStream myInput = mycontext.getAssets().open("dic");
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myInput.close();
myOutput.flush();
myOutput.close();
}
public String display(int row, int position){
Cursor d=mydb.query("words", null, null, null, null, null, null);
d.moveToPosition(position);
String name=d.getString(row);
return name;
}
public Integer Count(){
Cursor cu=mydb.query("words", null, null, null, null, null, null);
int s=cu.getCount();
return s;
}
public Integer Count_serach(String word){
Cursor cu;
cu=mydb.rawQuery("select * from words where enWord Like '%"+word+"%'", null);
int s=cu.getCount();
return s;
}
public String serach(int row,int col,String word){
Cursor cu;
cu=mydb.rawQuery("select * from words where enWord Like '%"+word+"%'", null);
cu.moveToPosition(row);
String s=cu.getString(col);
return s;
}
}
请原谅我浪费你的时间。 我是伊朗人,如果上述文本有问题,我道歉! 感谢您的耐心和宽容亲爱的朋友。 Ali Bazrafshan。伊朗,呼罗珊,Ferdows
答案 0 :(得分:0)
首先改善您的查询...请指定column name
而不是*
。并在搜索查询中使用 LIMIT 子句。
使用此:
SELECT COLUMN_NAME1,COLUMN_NAME2,COLUMN_NAME3 FROM words where enWord Like '%'+word+'%' LIMIT 10;
而不是:
select * from words where enWord Like '%"+word+"%'
然后 INDEX 您的搜索栏。
我认为这些技巧会帮助你......