android - 从数据库填充 String 和 ListView

标签 android sqlite android-sqlite

我正在尝试从我的 SQLite 数据库中填充一个 ListView。我知道如何使用数组来做到这一点。我需要对数据库类的查询类进行一些修改。 我需要用于查询和数据库构造函数的完整库和类代码。我也在寻找使用我自己的数据库中的查询生成 ListView Activity 的代码,如下代码所示:

package com.sqlite.www;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

public class DataBaseHelper extends SQLiteOpenHelper {

    //The Android s default system path of your application database.
    private static String DB_PATH = "/data/data/com.sqlite.www/databases/";
    private static String DB_NAME = "TheProjectDatabase.sqlite";
    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.
}

这里是创建数据库的地方:

public class SQLiteActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        DataBaseHelper myDbHelper ;
        myDbHelper = new DataBaseHelper(this);

        try {
            myDbHelper.createDataBase();
        } catch (IOException ioe) {
            throw new Error("Unable to create database");
        }
        try {
            myDbHelper.openDataBase();
        }catch(SQLException sqle){
            throw sqle;
        }  
    }
}

关于如何解决这个问题有什么建议吗?

最佳答案

SimpeCursorAdapter可能是您正在寻找的适配器。

根据评论更新(如何查询数据)

private Cursor queryData() {
    return myDataBase.query(
        "tableName",
        new String[] {"list", "of", "colums", "to", "select"},
        "columnName = ?", // your where condition
        new String[] {"your ? repleacements"},
        null, // no group by
        null, // no having
        null); // on order by
}

关于android - 从数据库填充 String 和 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7538562/

相关文章:

c++ - 如何将 SQLite 表设置为 'version'?

java - 如何在android studio中的java类中的包文件中打开sqlite db

java - 如何获取应用程序的 SDK 版本而不是设备的 SDK 版本?

php - 如何将本地主机数据库 php mysql 文件传输到 C 面板服务器而不会出现错误或问题

Go SQlite 并发问题

java - 将值插入数据库

android - "SQLiteDiskIOException: error code 10: disk I/O error"在 DROP TABLE 上返回 ICS 和 Samsung Nexus

android - 当连接中有多个 _id 列时,如何访问各个 _id 列?

android - NDK 安装在 Unity Hub 中,但 Unity 无法访问它

java - 使用 Java 而不是 xml 时多行文本中的不同行为