使用eclipse在android编程中使用外部数据库

时间:2014-06-30 07:10:42

标签: java android database eclipse sqlite

我是java和android的初学者。现在我想使用外部数据库(cancer.db)。 我创建了" DataBaseHelper"类。

public class DataBaseHelper extends SQLiteOpenHelper{

//The Android's default system path of your application database.
private static String DB_PATH = "/data/data/YOUR_PACKAGE/databases/";

private static String DB_NAME = "myDBName";

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


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

然后我使用下面的代码"在创建"创建或打开数据库的方法:

 private static String DB_PATH = "/data/data/info.myprogram/databases/";
 private static String DB_NAME = "cancer.db";
 DataBaseHelper myDbHelper = new DataBaseHelper();
    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;

}

我使用这些代码来获取查询。我的表名是" shb":

        SQLiteDatabase db;
    Cursor cc= db.rawQuery("SELECT Name FROM shb WHERE _id=1",null);
    cc.moveToFirst();
String sss=cc.getString(1);

现在当我开始调试时,我得到了错误。错误的代码是什么?我的错是什么?我应该如何获得查询? 请原谅我的英语不好,因为这不是我的母语。

1 个答案:

答案 0 :(得分:-1)

首先创建一个sqlite数据库并在其中创建表,将其放在app的assets文件夹中。使用以下代码使用该数据库。请更改datbaseName,tableName,fieldsName和数据库路径等的代码。我还通过传递paerticuler值来编写获取数据列表的代码。

public class MySQLiteHelper extends SQLiteOpenHelper {

public static final String TABLE_CARS = "Cars";
public static final String COL_ENAME = "ename";
public static final String COL_MODAL = "modal";
public static final String COL_ANAME = "aname";
public static final String COL_TYPES = "types";

private static final String TAG = "MSSS : DatabaseHelper";
// Your Database Name
private static final String DATABASE_NAME = "4saleCars.sqlite";
// Your Your Database Version
private static final int DATABASE_VERSION = 1;
private final Context myContext;
private SQLiteDatabase myDataBase;
// The Android's default system path of your application database. DB_PATH =
// "/data/data/YOUR_PACKAGE/databases/"
private String DB_PATH = "/data/data/net.forsalemall.android/databases/";


public MySQLiteHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    this.myContext = context;
    try {
        createDataBase();
    } catch (Exception e) {
        Log.e(TAG,
                "DatabaseHelper_constuctor createDataBase :"
                        + e.fillInStackTrace());
    }
}

@Override
public void onCreate(SQLiteDatabase database) {

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

// ***************************** My DB Handler Methods
// *****************************
/**
 * Creates a empty database on the system and rewrites it with your own
 * database.
 **/
public void createDataBase() throws IOException {
    boolean dbExist = checkDataBase();
    if (dbExist) {
        // Database already exist
        openDataBase();

    } 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.
        myDataBase = getWritableDatabase();
        try {
            copyDataBase();
        } catch (IOException e) {
            throw new Error("Error createDataBase().");
        }
    }
}

/**
 * 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 + DATABASE_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READWRITE);
    } catch (SQLiteException e) {
        // database does't exist yet.
    }
    if (checkDB != null) {
        checkDB.close();
    }
    return checkDB != null ? true : false;
}

/*
 * public boolean isDataBaseExist() { File dbFile = new File(DB_PATH +
 * DATABASE_NAME); return dbFile.exists(); }
 */

/**
 * 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 transferring bytestream.
 **/
private void copyDataBase() throws IOException {
    try {
        // Open your local db as the input stream
        InputStream myInput = myContext.getAssets().open(DATABASE_NAME);

        // Path to the just created empty db
        String outFileName = DB_PATH + DATABASE_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();
    } catch (IOException e) {
        throw new Error("Error copyDataBase().");
    }
}

public void openDataBase() throws SQLException, IOException {
    try {
        // Open the database
        String myPath = DB_PATH + DATABASE_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READWRITE);
    } catch (SQLiteException e) {
        throw new Error("Error openDataBase().");
    }
}

// ***************************** My DML Methods
// *****************************

public List<String> getModalList(String aname, Context context) {
    List<String> list = new ArrayList<String>();
    list.add(context.getResources().getString(R.string.all));
    Cursor cursor;
    String query;
    query = "SELECT modal FROM Cars WHERE aname =  '" + aname + "';";

    try {
        cursor = myDataBase.rawQuery(query, null);
        if (cursor != null) {
            while (cursor.moveToNext())

                list.add(Utils.getDecodedString(cursor.getString(0)));
        }
        cursor.deactivate();
    } catch (Exception e) {
        Log.e(TAG, "getModalList Error : " + e.fillInStackTrace());
    }
    return list;
}
  }

在您的活动中使用此 getModalList ,如下所示

MySQLiteHelper dbHelper = new MySQLiteHelper(
                AdvanceSearchActivity.this);
String aname = Utils.getEncodedString(catName);

car_modal = dbHelper.getModalList(aname,AdvanceSearchActivity.this);