2016-01-27 122 views
0

大家好。如何將外部數據庫連接到應用程序

我正在嘗試製作字典應用程序。 我試圖複製我的數據庫"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。 Iran,Khorasan,Ferdows

+0

你的問題不清楚...你是否正在尋找更快的查詢/搜索?也沒有尋找外部數據庫的例子?... –

+0

我說,當我使用數據庫有很多記錄,設備將掛斷。但是當我使用這些鱈魚作爲基礎數據庫時,它會運行良好。所以,當你閱讀,我有一個搜索和使用我的數據庫,它有很多記錄(140000記錄)的問題。 – Ali

+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搜索欄。

我認爲這些技巧會幫助你...

相關問題