2014-02-13 71 views
1

嗨,我无法读取我的项目中的嵌入式SQLite数据库。无法从Android中的本地SQLite数据库读取?

我想从一个活动获取数据到另一个活动并在TextView中显示它。

这里是我的数据库工具类:

public class myDBTools extends SQLiteOpenHelper { 

private static String DB_PATH = "/data/data/com.example.appscan5/databases/"; 

private static String DB_NAME = "productlist"; 

private static SQLiteDatabase myDatabase; 

public myDBTools(Context applicationContext) { 
    super(applicationContext, DB_NAME, null, 1); 

} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    myDatabase= SQLiteDatabase.openDatabase(DB_PATH + DB_NAME,null, SQLiteDatabase.CREATE_IF_NECESSARY); 

} 

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

} 

public static HashMap<String, String> getProductInfo(String id) { 

    HashMap<String, String> productMap = new HashMap<String, String>(); 

    String selectQuery = "SELECT * FROM products WHERE _id='" + id + "'"; 

    Cursor cursor = myDatabase.rawQuery(selectQuery, null); 

    // move to the first row of dataBase 
    if (cursor.moveToFirst()) { 

     do { 

      productMap.put("NumberId", cursor.getString(0)); 
      productMap.put("BarcodeId", cursor.getString(1)); 
      productMap.put("ProductName", cursor.getString(2)); 
      productMap.put("Calories", cursor.getString(3)); 
      productMap.put("Protein", cursor.getString(4)); 
      productMap.put("Carbohydrates", cursor.getString(5)); 
      productMap.put("Fats", cursor.getString(6)); 
      productMap.put("Grams", cursor.getString(7)); 

     } while (cursor.moveToNext()); 

    } 
    return productMap; 
} 
} 

这是我如何使用它的另一项活动:

myDBTools mydbTools = new myDBTools(this); 
HashMap<String, String> productMap = mydbTools.getProductInfo(id); 
+0

只是额外的一点,你可能不想使用'SELECT *',如果你的结构稍后有任何改变,它可能会让你从这些位置获取信息。最好使用'SELECT numberId,barcodeId,productName'等 – Nicholas

回答

1

您需要先打开数据库。

mydbTools.open(); 

把上面一行到您的OnCreate,它会工作

1

您必须执行任何操作之前Open数据库:打造开放式方法

// ---opens the database--- 
public myDBTools open() throws SQLException { 
    db = DBHelper.getWritableDatabase(); 
    return this; 
} 

而且必须Close数据库操作后完成。创建close方法

// ---closes the database--- 
public void close() { 
    DBHelper.close(); 
} 

现在,创造一个像

myDBTools mydbTools = new myDBTools(this); 
mydbTools.open(); 

//All the operations related to database 
mydbTools.close(); 
0

myDBTools object叫这个OpenClose方法后使用的SQLite数据库有很多的麻烦。看来我一直在创建一个数据库,但没有复制我的数据库文件的内容到新创建的数据库使用SQLiteOpenHelper。

到底我有没有表的一个数据库,它和DUS我不能执行选择查询和这里就是我得到了一个错误:

String selectQuery = "SELECT * FROM products WHERE _id='" + id + "'"; 
Cursor cursor = myDatabase.rawQuery(selectQuery, null); 

这是我的全部工作的代码到目前为止的数据库类:

public class MyDatabase extends SQLiteOpenHelper { 

private static String TAG = MyDatabase.class.getName(); 

private String DB_PATH = "/data/data/com.example.appscan5/databases/"; 
private static String DB_NAME = "productlist.db"; 

private SQLiteDatabase myDataBase = null; 
private final Context myContext; 

public MyDatabase(Context context) { 
    super(context, DB_NAME, null, 1); 

    this.myContext = context; 
    Log.v("log_tag", "DBPath: " + DB_PATH); 
    // File f=getDatabasePath(DB_NAME); 
} 

public void createDataBase() throws IOException { 
    boolean dbExist = checkDataBase(); 
    SQLiteDatabase db_Read = null; 
    if (dbExist) { 
     Log.v("log_tag", "database does exist"); 
    } else { 
     Log.v("log_tag", "database does not exist"); 

     //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. 
     db_Read = this.getReadableDatabase();   
     db_Read.close(); 

     try { 
      copyDataBase(); 
     } catch (IOException e) { 
      throw new Error("Error copying database"); 
     } 
    } 
} 

private void copyDataBase() throws IOException { 
    InputStream myInput = myContext.getAssets().open(DB_NAME); 
    String outFileName = DB_PATH + DB_NAME; 
    OutputStream myOutput = new FileOutputStream(outFileName); 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myInput.read(buffer)) > 0) { 
     myOutput.write(buffer, 0, length); 
    } 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 
} 

private boolean checkDataBase() { 

    File dbFile = new File(DB_PATH + DB_NAME); 
    Log.v("dbFile", dbFile + " " + dbFile.exists()); 

    return dbFile.exists(); 
} 

public boolean openDataBase() throws SQLException { 

    String mPath = DB_PATH + DB_NAME; 
    myDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY); 

    return myDataBase != null; 
} 


@Override 
public synchronized void close() { 
    if (myDataBase != null) myDataBase.close(); 

    super.close(); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 

    //When i use this createQuery i create a database and don't get an error but the database is empty. 

    // String createQuery = 
    // "CREATE TABLE products (numberId INTEGER NOT NULL, barcodeID TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL, calories INTEGER NOT NULL, protein INTEGER,carbohydrates INTEGER, fats INTEGER, grams INTEGER, sodium INTEGER, fibre INTEGER)"; 
    // db.execSQL(createQuery); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    Log.v(TAG, "Upgrading database, this will drop database and recreate."); 
} 

public HashMap<String, String> getProductInfo(String id) { 

    HashMap<String, String> productMap = new HashMap<String, String>(); 

    SQLiteDatabase db = this.getReadableDatabase(); 
    openDataBase(); 


    // HERE I GET AN EROR (NO SUCH TABLE) 
    String selectQuery = "SELECT * FROM products WHERE barcodeId='" + id + "'"; 

    //String selectQuery = "SELECT * FROM products"; 


    Cursor myCursor = db.rawQuery(selectQuery, null); 
    if (!myCursor.moveToFirst()) { 
     Log.w("debug", "No tables!"); 
    } else 
     Log.w("Done", "Table is here"); 


    do { 

     productMap.put("NumberId", myCursor.getString(0)); 
     productMap.put("BarcodeId", myCursor.getString(1)); 
     productMap.put("ProductName", myCursor.getString(2)); 
     productMap.put("Calories", myCursor.getString(3)); 
     productMap.put("Protein", myCursor.getString(4)); 
     productMap.put("Carbohydrates", myCursor.getString(5)); 
     productMap.put("Fats", myCursor.getString(6)); 
     productMap.put("Grams", myCursor.getString(7)); 
     productMap.put("Sodium", myCursor.getString(8)); 
     productMap.put("Fibre", myCursor.getString(9)); 


    } while (myCursor.moveToNext()); 



    close(); 
    return productMap; 


    // My second query here fails, since the database contains no tables. 
} 

} 

这是我如何使用它的代码:

//-------------------------------------------------------------------------------- 
MyDatabase myDB = new MyDatabase(this); 
try { 
    myDB.createDataBase(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

HashMap<String, String> productMap =myDB.getProductInfo(id); 
//--------------------------------------------------------------------------------    

我不是相当舒服是这是使用MyDatabase类的最好方法。如果有人更好地使用它,请分享一个解释原因。

干杯!