我是Android的菜鸟。当我使用SQLite表时,我得到一个非法的参数异常。 logcat表明这是由于我的光标没有关闭所以我关闭了所有的游标。现在我仍然得到没有详细消息的IllegalArgumentException,我的logcat没有显示任何错误消息只是调试和警告消息。没有任何错误消息指向我正确的方向我不知道如何开始解决这个问题。非常感谢任何帮助。
这是我预先修复了光标问题的代码:
public static final String KEY_ROWID = "_id";
public static final String KEY_NAME = "cointype_name";
public static final String KEY_QUANTITY = "cointype_quantity";
public static final String KEY_OUNCES = "cointype_ounces";
public static final String KEY_VALUE = "cointype_value";
private static final String DATABASE_NAME = "PortfolioDatabase";
private static final String DATABASE_TABLE = "cointypeTable";
private static final int DATABASE_VERSION = 1;
private DbHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;
private static class DbHelper extends SQLiteOpenHelper{
public DbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +
KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
KEY_NAME + " TEXT NOT NULL, " +
KEY_QUANTITY + " TEXT NOT NULL, " +
KEY_OUNCES + " TEXT NOT NULL, " +
KEY_VALUE + " TEXT NOT NULL);"
);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
onCreate(db);
}
}
public PortfolioDatabase(Context c){
ourContext = c;
}
public PortfolioDatabase open() throws SQLException{
ourHelper = new DbHelper(ourContext);
ourDatabase = ourHelper.getWritableDatabase();
return this;
}
public void close(){
ourHelper.close();
}
public long createEntry(String coin, String quantity, String ounces, String value) {
// TODO Auto-generated method stub
ContentValues cv = new ContentValues();
cv.put(KEY_NAME, coin);
cv.put(KEY_QUANTITY, quantity);
cv.put(KEY_OUNCES, ounces);
cv.put(KEY_VALUE, value);
return ourDatabase.insert(DATABASE_TABLE, null, cv);
}
public String getData() {
// TODO Auto-generated method stub
String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_QUANTITY, KEY_OUNCES, KEY_VALUE };
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
String result = "";
int iRow = c.getColumnIndex(KEY_ROWID);
int iName = c.getColumnIndex(KEY_NAME);
int iQuantity = c.getColumnIndex(KEY_QUANTITY);
int iOunces = c.getColumnIndex(KEY_OUNCES);
int iValue = c.getColumnIndex(KEY_VALUE);
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
result = result + /*c.getString(iRow) + " " +*/ c.getString(iName) + " " + c.getString(iQuantity) + " " + c.getString(iOunces) + " " + c.getString(iValue) + "\n";
}
c.close();
return result;
}
public String getCoin() {
// TODO Auto-generated method stub
String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_QUANTITY, KEY_OUNCES, KEY_VALUE };
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
String result = "";
int iRow = c.getColumnIndex(KEY_ROWID);
int iName = c.getColumnIndex(KEY_NAME);
int iQuantity = c.getColumnIndex(KEY_QUANTITY);
int iOunces = c.getColumnIndex(KEY_OUNCES);
int iValue = c.getColumnIndex(KEY_VALUE);
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
result = result + /*c.getString(iRow) + " " +*/ c.getString(iName).substring(0, Math.min(18, c.getString(iName).length())) + "\n";
}
c.close();
return result;
}
public String getQty() {
// TODO Auto-generated method stub
String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_QUANTITY, KEY_OUNCES, KEY_VALUE };
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
String result = "";
int iRow = c.getColumnIndex(KEY_ROWID);
int iName = c.getColumnIndex(KEY_NAME);
int iQuantity = c.getColumnIndex(KEY_QUANTITY);
int iOunces = c.getColumnIndex(KEY_OUNCES);
int iValue = c.getColumnIndex(KEY_VALUE);
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
result = result + /*c.getString(iRow) + " " +*/ c.getString(iQuantity) + "\n";
}
c.close();
return result;
}
public String getOunces() {
// TODO Auto-generated method stub
String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_QUANTITY, KEY_OUNCES, KEY_VALUE };
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
String result = "";
int iRow = c.getColumnIndex(KEY_ROWID);
int iName = c.getColumnIndex(KEY_NAME);
int iQuantity = c.getColumnIndex(KEY_QUANTITY);
int iOunces = c.getColumnIndex(KEY_OUNCES);
int iValue = c.getColumnIndex(KEY_VALUE);
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
result = result + /*c.getString(iRow) + " " +*/ c.getString(iOunces) + "\n";
}
c.close();
return result;
}
public String getValue() {
// TODO Auto-generated method stub
String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_QUANTITY, KEY_OUNCES, KEY_VALUE };
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
String result = "";
int iRow = c.getColumnIndex(KEY_ROWID);
int iName = c.getColumnIndex(KEY_NAME);
int iQuantity = c.getColumnIndex(KEY_QUANTITY);
int iOunces = c.getColumnIndex(KEY_OUNCES);
int iValue = c.getColumnIndex(KEY_VALUE);
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
result = result + /*c.getString(iRow) + " " +*/ c.getString(iValue) + "\n";
}
c.close();
return result;
}
public String getSingleValue(String aCoin) throws SQLException{
// TODO Auto-generated method stub
String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_QUANTITY, KEY_OUNCES, KEY_VALUE};
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_NAME + "=" + aCoin, null, null, null, null);
String result = "";
int iRow = c.getColumnIndex(KEY_ROWID);
int iName = c.getColumnIndex(KEY_NAME);
int iQuantity = c.getColumnIndex(KEY_QUANTITY);
int iOunces = c.getColumnIndex(KEY_OUNCES);
int iValue = c.getColumnIndex(KEY_VALUE);
if (c != null){
c.moveToFirst();
result= c.getString(0);
return result;
}
c.close();
return null;
}
/*public String getHotness(long l) throws SQLException{
// TODO Auto-generated method stub
String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_QUANTITY, KEY_VALUE };
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_ROWID + "=" + l, null, null, null, null);
if (c != null){
c.moveToFirst();
String hotness = c.getString(2);
return hotness;
}
c.close();
return null;
}*/
public void updateEntry(String mCoin, String mQuantity, String mOunces, String mValue) throws SQLException{
// TODO Auto-generated method stub
String[] whereArgs = new String[] { mCoin };
ContentValues cvUpdate = new ContentValues();
cvUpdate.put(KEY_NAME, mCoin);
cvUpdate.put(KEY_QUANTITY, mQuantity);
cvUpdate.put(KEY_OUNCES, mOunces);
cvUpdate.put(KEY_VALUE, mValue);
ourDatabase.update(DATABASE_TABLE, cvUpdate, KEY_NAME + "=?", whereArgs);
}
public void changeCurrency(String mCoin, String mValue) throws SQLException{
// TODO Auto-generated method stub
String[] whereArgs = new String[] { mCoin };
ContentValues cvUpdate = new ContentValues();
cvUpdate.put(KEY_NAME, mCoin);
cvUpdate.put(KEY_VALUE, mValue);
ourDatabase.update(DATABASE_TABLE, cvUpdate, KEY_NAME + "=?", whereArgs);
}
public void deleteEntry(String coin) throws SQLException{
String[] whereArgs = new String[] { coin };
ourDatabase.delete(DATABASE_TABLE, KEY_NAME + "=?", whereArgs);
}
public void removeAll()
{
/*// db.delete(String tableName, String whereClause, String[] whereArgs);
// If whereClause is null, it will delete all rows.
SQLiteDatabase db = helper.getWritableDatabase(); // helper is object extends SQLiteOpenHelper
db.delete(DatabaseHelper.TAB_USERS, null, null);
db.delete(DatabaseHelper.TAB_USERS_GROUP, null, null);*/
ourDatabase.delete(DATABASE_TABLE, null, null);
}
}
导致错误的代码。
public void add(){
boolean didItWork = true;
try {
//String name = sqlName.getText().toString();
//String hotness = sqlHotness.getText().toString();
calculateaddentry();
String coin = addcoinselection.getSelectedItem().toString();
String quantity = sqlAddCoin.getText().toString();
String ounces = entryounces;
String value = denomination + newentryvalue;
//PortfolioDatabase entry = new PortfolioDatabase(Portfolio.this);
info.open();
info.createEntry(coin, quantity, ounces, value);
info.close();
info.open();
String data = info.getData();
String ccoin = info.getCoin();
String cqty = info.getQty();
String counces = info.getOunces();
String cvalue = info.getValue();
info.close();
currentcoin.setText(ccoin);
currentqty.setText(cqty);
currentounces.setText(counces);
currentvalue.setText(cvalue);
} catch (Exception e) {
didItWork = false;
String error = e.toString();
Dialog d = new Dialog(this);
d.setTitle("Dang it!");
TextView tv = new TextView(this);
tv.setText(error);
d.setContentView(tv);
d.show();
} finally {
if (didItWork) {
/*Dialog d = new Dialog(this);
d.setTitle("Heck Yea!");
TextView tv = new TextView(this);
tv.setText("Success");
d.setContentView(tv);
d.show();*/
}
}}
答案 0 :(得分:1)
尝试将DATABASE_VERSION
值更改为2
,并在更改表结构,添加列或在数据库类中添加表时递增。
DATABASE_VERSION
中的更改会触发对onUpgrade()
的调用,在您的情况下会调用该表并创建一个新表。只要DATABASE_VERSION
相同,就不会调用onUpgrade()
或onCreate()
,因此结构不会受到影响,因此不会更新数据库结构。这可能是您获得IllegalArgumentException的原因,因为它可能无法在设备的数据库中找到列,因为该列不存在。这就是文档所说的内容:
注意:此类假定单调增加升级的版本号。
http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html
因此,如果您创建一个简单的数据库,运行它,然后在onCreate()
方法中添加一列而不更改数据库版本,数据库类方法onCreate()
或onUpgrade()
赢了不应该被称为,因为就其而言,数据库是相同的。
您必须记住Android本地数据库持久。除应用程序运行外,它将保留在您的设备上。因此,数据库将信息从应用程序的一次运行保存到另一次。每次 运行应用程序时,数据库 都不会重置。这不仅包括它拥有的数据,还包括 数据库结构,例如表和列。
首先运行代码时,它将检查是否已创建数据库。这是在实际设备上。如果存在,它将检查设备上的数据库版本是否与助手类中的DATABASE_VERSION
匹配。如果是这样,它什么都不做。如果数据库类中的DATABASE_VERSION
大于设备上的数据库版本,则调用onUpgrade()
方法并按定义调整数据库。
答案 1 :(得分:0)
确保不留下待处理的交易并打开游标。
对于INSERT,UPDATE,DELETE:
db.beginTransaction();
try{
//INSERT/UPDATE/DELETE statements here
db.setTransactionSuccessful();
}finally {
db.endTransaction();
}
对于游标:
Cursor c = db.query( // query code
try{
while(c.moveToNext()){
// read data
}
} finally{
c.close();
}
答案 2 :(得分:0)
尝试将数据库名称和表名重命名为全部小写。
private static final String DATABASE_NAME = "portfolio_database";
private static final String DATABASE_TABLE = "cointype_table";
数据库以前是否有效?