работа с внешней базой данных при программировании на Android с eclipse

#java #android #database #eclipse #sqlite

#java #Android #База данных #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. Какую ошибку вы получили?

2. я не знаю, код не выделен. но на вкладке methode.class не найден исходный код для записи!!

3. пожалуйста, покажите вывод logact, нам нужно знать, в чем именно проблема..

4. это то, что вы хотите?? 06-30 07:37:03.543: W / ActivityManager(58): Время ожидания запуска истекло, отказ от блокировки пробуждения! 06-30 07:37:03.615: W / ActivityManager(58): Время ожидания активности для HistoryRecord{460f0070 info.hossein. AgeGofti/.Страница 1}

Ответ №1:

Сначала создайте базу данных sqlite и создайте таблицу внутри нее, поместите ее в папку assets вашего приложения. используйте эту базу данных, используя следующий код. пожалуйста, внесите изменения в код для вашего имени базы данных, имени таблицы, имени полей и пути к базе данных и т.д. я также написал код получения списка данных путем передачи значения параметра.

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