如何从android中的sqlite数据库中检索数据并在TextView中显示

时间:2021-04-27 19:28:42

I am learning Android. I have a problem and I can't solve it. I want to retrieve data from an existing database and display it in a TextView after click button.

我正在学习Android。我有个问题,我解决不了。我想从现有的数据库中检索数据,并在单击按钮后在TextView中显示数据。

My code DataBaseHelper looks like this:

我的代码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 looks like this:

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

            }
            });
        }

}

I did as above and Eclipse gives me errors.

我这样做了,Eclipse给了我错误。

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

My code is:

我的代码是:

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;
    }

}

And:

和:

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);
        }
        });
    }

What am I doing wrong? I want retrieve data from database and show in TextView after click button. Your help would be appreciated.

我做错了什么?我想从数据库中检索数据并在单击按钮后显示在TextView中。非常感谢您的帮助。

5 个解决方案

#1


24  

on button click, first open the database, fetch the data and close the data base like this

单击按钮,首先打开数据库,获取数据并像这样关闭数据库。

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
            }
        });
    }
}

and your getYourData() in database class would be like this

数据库类中的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;
}

#2


4  

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

You cannot cast EditText to TextView.

不能将EditText转换为TextView。

#3


3  

You may use this following code actually it is rough but plz check it out

您可以使用下面的代码实际上它是粗略的,但是请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


0  

First cast your Edit text like this:

首先将编辑文本如下所示:

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

And after that close the DB not befor this line...

然后关闭DB,而不是这条线。

 myDataBaseHelper.close(); 

#5


-1  

You are using getData() method as void.

您将使用getData()方法作为void。

You can not return values from void.

不能从void返回值。

#1


24  

on button click, first open the database, fetch the data and close the data base like this

单击按钮,首先打开数据库,获取数据并像这样关闭数据库。

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
            }
        });
    }
}

and your getYourData() in database class would be like this

数据库类中的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;
}

#2


4  

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

You cannot cast EditText to TextView.

不能将EditText转换为TextView。

#3


3  

You may use this following code actually it is rough but plz check it out

您可以使用下面的代码实际上它是粗略的,但是请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


0  

First cast your Edit text like this:

首先将编辑文本如下所示:

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

And after that close the DB not befor this line...

然后关闭DB,而不是这条线。

 myDataBaseHelper.close(); 

#5


-1  

You are using getData() method as void.

您将使用getData()方法作为void。

You can not return values from void.

不能从void返回值。