2014-06-30 27 views
-1

我是java和android的初学者。现在我想与外部数据库(cancer.db)一起工作。 我创建了“DataBaseHelper”类。在android编程中使用外部数据库和eclipse

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

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

+0

你得到什么错误? –

+0

我不知道,没有代码是突出显示。但在tab methode.class是writed源未找到! – user3789220

+0

请显示logact输出,我们需要知道问题出在哪里。 – Opiatefuchs

回答

-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); 
相关问题