2012-09-06 161 views
9

我正在學習Android。我有一個問題,我無法解決它。我想從現有的數據庫檢索數據,並在單擊按鈕後顯示在TextView中。如何從android中的sqlite數據庫檢索數據並在TextView中顯示

我的代碼DataBaseHelper看起來是這樣的:

public class DataBaseHelper extends SQLiteOpenHelper { 

      //The Android's default system path of your application database.  
      private static String DB_PATH = "/data/data/in.ekonomia.android/databases/";  
      private static String DB_NAME = "cytaty";  
      private SQLiteDatabase myDataBase;  
      private final Context myContext;  

     /**  * Constructor  * Takes and keeps a reference of the passed context in order to access to the application assets and resources.  * @param context  */  
    public DataBaseHelper(Context context) 
    {  
     super(context, DB_NAME, null, 1);   
     this.myContext = context;  

    }  
    /**  * Creates a empty database on the system and rewrites it with your own database.  * */  
    public void createDataBase() throws IOException 
    {  
     boolean dbExist = checkDataBase();  
     if(dbExist){    
      //do nothing - database already exist  
      }else{   
       //By calling this method and empty database will be created into the default system path    
       //of your application so we are gonna be able to overwrite that database with our database.   
       this.getReadableDatabase();    
       try 
       {    
        copyDataBase();    
        } catch (IOException e) 
        {    
         throw new Error("Error copying database");   
         }  
       }  
     }  
    /**  * Check if the database already exist to avoid re-copying the file each time you open the application.  * @return true if it exists, false if it doesn't  */  
    private boolean checkDataBase() 
    {  SQLiteDatabase checkDB = null;  
    try 
    {   
     String myPath = DB_PATH + DB_NAME;   
     checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);  
     }catch (SQLiteException e) 
     {   
      //database does't exist yet.   
      }  
    if(checkDB != null) 
    {   
     checkDB.close();   
     }  
    return checkDB != null ? true : false;  
    }  
    /**  * Copies your database from your local assets-folder to the just created empty database in the  * system folder, from where it can be accessed and handled.  * This is done by transfering bytestream.  * */  
    private void copyDataBase() throws IOException 
    {  
     //Open your local db as the input stream   
     InputStream myInput = myContext.getAssets().open(DB_NAME);  
     // Path to the just created empty db   
     String outFileName = DB_PATH + DB_NAME;   
     //Open the empty db as the output stream   
     OutputStream myOutput = new FileOutputStream(outFileName);  
     //transfer bytes from the inputfile to the outputfile  
     byte[] buffer = new byte[1024];  
     int length;  
     while ((length = myInput.read(buffer))>0) 
     {   
      myOutput.write(buffer, 0, length);  
      }  
     //Close the streams  
     myOutput.flush();  
     myOutput.close();  
     myInput.close();  
     }  
    public void openDataBase() throws SQLException {   
     //Open the database  
     String myPath = DB_PATH + DB_NAME;  
     myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);  
     }  
    @Override 
     public synchronized void close() 
    {   
     if(myDataBase != null)    
     myDataBase.close();    
    super.close(); 
    } 
    @Override 
    public void onCreate(SQLiteDatabase db) 
    { } 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }   
    // Add your public helper methods to access and get content from the database.  
    // You could return cursors by doing "return myDataBase.query(....)" so it'd be easy  
    // to you to create adapters for your views. 

    } 

Cytaty.java看起來是這樣的:

package in.ekonomia.android; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 


public class cytaty extends Activity { 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.galeria); 


     Button bLosuj = (Button) findViewById(R.id.button1); 
     bLosuj.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
       // TODO Auto-generated method stub 

      } 
      }); 
     } 

} 

我如上沒和Eclipse給我的錯誤。

Database name: cytaty 
name of table: cytaty 
columns: _id, autor, cytat 

代碼是:

public void getData() { 
    public String[] getAppCategorydetail() { 
     String Table_Name="cytaty"; 

     String selectQuery = "SELECT * FROM " + Table_Name; 
       SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 
       String[] data = null; 
     if (cursor.moveToFirst()) { 
      do { 
       // get the data into array,or class variable 
      } while (cursor.moveToNext()); 
     } 
     db.close(); 
     return data; 
    } 

} 

和:

Button bLosuj = (Button) findViewById(R.id.button1); 
    bLosuj.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      DataBaseHelper myDataBaseHelper = new DataBaseHelper(cytaty.this); 
       myDataBaseHelper.openDataBase(); 
       String text= myDataBaseHelper.getData();//this is the method to query 
       myDataBaseHelper.close(); 
      // set text to your TextView 
      TextView tekst = (TextView) findViewById(R.id.editText1); 
      tekst.setText(text); 
     } 
     }); 
    } 

我在做什麼錯? 我想從數據庫檢索數據,並在點擊按鈕後顯示在TextView。您的幫助將不勝感激。

+3

HTTP仔細閱讀此篇://www.androidhive。信息/ 2011/11/Android的源碼數據庫教程/ – Akshay

回答

23

上按一下按鈕,先打開數據庫,獲取數據並關閉這樣

public class cytaty extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.galeria); 

     Button bLosuj = (Button) findViewById(R.id.button1); 
     bLosuj.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      myDatabaseHelper = new DatabaseHelper(cytaty.this); 
      myDatabaseHelper.openDataBase(); 

      String text = myDatabaseHelper.getYourData(); //this is the method to query 

      myDatabaseHelper.close(); 
      // set text to your TextView 
      } 
     }); 
    } 
} 

和數據庫類的getYourData()數據庫會是這樣

public String[] getAppCategoryDetail() { 

    final String TABLE_NAME = "name of table"; 

    String selectQuery = "SELECT * FROM " + TABLE_NAME; 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor  = db.rawQuery(selectQuery, null); 
    String[] data  = null; 

    if (cursor.moveToFirst()) { 
     do { 
      // get the data into array, or class variable 
     } while (cursor.moveToNext()); 
    } 
    cursor.close(); 
    return data; 
} 
3

您可以使用這下面的代碼實際上它是粗糙的,但PLZ檢查出來

db = openOrCreateDatabase("sms.db", SQLiteDatabase.CREATE_IF_NECESSARY, null); 
Cursor cc = db.rawQuery("SELECT * FROM datatable", null); 
final ArrayList<String> row1 = new ArrayList<String>(); 
final ArrayList<String> row2 = new ArrayList<String>(); 

if(cc!=null) { 
    cc.moveToFirst(); 
    startManagingCursor(cc); 
    for (int i=0; i<cc.getCount(); i++) { 

    String number = cc.getString(0); 
    String message = cc.getString(1); 
    row1.add(number); 
    row2.add(message); 

    final EditText et3 = (EditText) findViewById(R.id.editText3); 
    final EditText et4 = (EditText) findViewById(R.id.editText4); 
    Button bt1 = (Button) findViewById(R.id.button1); 
    bt1.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      switch (v.getId()) { 
       case R.id.button1: 
        et3.setText(row1.get(count)); 
        et4.setText(row2.get(count)); 
        count++; 
        break; 
       default: 
        break; 
      } 

     } 
    }); 

cc.moveToNext(); 
} 
4
TextView tekst = (TextView) findViewById(R.id.editText1); 

你不能投EditTextTextView

0

您正在使用getData()方法爲void。

不能從void返回值。

0

首先投出您編輯的文字是這樣的:

TextView tekst = (TextView) findViewById(R.id.editText1); 
tekst.setText(text); 

這接近了DB不befor這條線......經過

myDataBaseHelper.close(); 
相關問題