我正在学习
Android我有一个问题,我无法解决.我想从现有数据库中检索数据,并在点击按钮后的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,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,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,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); } }); }
解决方法
点击按钮,首先打开数据库,获取数据并关闭数据库
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; }