2012-03-16 63 views
0

遇到显示第二个活动中的数据的问题。 当我运行方法getData形式的第二个Activity会崩溃。无法从SQLite数据库读取。活动尝试从光标检索数据时崩溃

类Dabase

public static final String KEY_ROWID = "ExpenseID";  
    public static final String KEY_Expense = "ExpenseDescription"; 
    public static final String KEY_Amount = "Amount"; 

    private static final String DATABASE_NAME = "CSolutionsLlcBudget"; 
    private static final String DATABASE_TABLE = "Expense"; 

    private static final int DATABASE_VERSION = 4; 
    private static final String CREATE_TABLE_1 = "CREATE TABLE " + DATABASE_TABLE + " (" + KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
    + KEY_Expense + "TEXT NOT NULL, " + KEY_Amount + "TEXT NOT NULL);"; 

    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_1);   
     }//end of onCreate 

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

    }//end of class 
    public BudgetInfo(Context c){ 
     ourContext = c; 
    } 

    public BudgetInfo open() throws SQLException{ 
     ourHelper = new DbHelper(ourContext); 
     ourDatabase = ourHelper.getWritableDatabase(); 
     return this; 
    } 
    public void close(){ 
     ourHelper.close(); 
    } 

    public long createEntry(String expense, String amount) { 
     // TODO Auto-generated method stub 
     ContentValues cv = new ContentValues(); 
     cv.put(KEY_Expense, expense); 
     cv.put(KEY_Amount, amount); 
     return ourDatabase.insert(DATABASE_TABLE, null, cv); 
    } 

    public String getData() { 
     // TODO Auto-generated method stub 
     String[] columns = new String[]{KEY_ROWID, KEY_Expense, KEY_Amount}; 
     Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); 
     String result = ""; 


     int iRow = c.getColumnIndex(KEY_ROWID); 
     int iExpense = c.getColumnIndex(KEY_Expense); 
     int iAmount = c.getColumnIndex(KEY_Amount); 

     for(c.moveToFirst();!c.isAfterLast(); c.moveToNext()){ 
      result = result + c.getString(iRow) + " " + c.getString(iExpense) + " " + c.getString(iAmount) + "\n"; 
     } 
     return result; 
    } 

次活动

public class SQLView extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.sqlview); 
     TextView tv = (TextView) findViewById(R.id.tvSQLinfo); 
     BudgetInfo info = new BudgetInfo(this); 
     info.open(); 
     String data = info.getData();   
     tv.setText(data); 
     info.close(); 
    } 
} 

应用程序崩溃的每一次点击,查看第二活动

+1

你可以粘贴你的崩溃logcat inforamtion? – idiottiger 2012-03-16 01:43:18

+0

你在哪里执行数据库中的插入? – 2012-03-16 01:40:51

回答

2

这里的几件事情ügotto先试。我假设你在之前的活动中将数据插入到表格中。

  1. 检查您的数据库是否已正确创建。

  2. 检查您的数据库中是否有数据。

  3. 此外,请检查您的光标不为空,并为movetofirst()返回true。 (即使你从其他职位获得解决方案,也必须这样做)。

  4. 完成后总是关闭光标。我没有看到你在这里做。

+0

感谢它的帮助 – user996502 2012-03-18 09:53:36

1

我想你可以尝试更换

BudgetInfo info = new BudgetInfo(this); 

BudgetInfo info = new BudgetInfo(getApplicationContext()); 

而且可能会尝试使用:

c.getString(cursor.getColumnIndex(iRow)) 
c.getString(cursor.getColumnIndex(iExpense)) 
c.getString(cursor.getColumnIndex(iAmount)) 

最后,请检查该行:

private static final String CREATE_TABLE_1 = "CREATE TABLE " + DATABASE_TABLE + " (" + KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
    + KEY_Expense + "TEXT NOT NULL, " + KEY_Amount + "TEXT NOT NULL);"; 

你可以有你的collunm名之间没有空格后声明文本。

你可以试试这个:

private static final String CREATE_TABLE_1 = "CREATE TABLE " + DATABASE_TABLE + " (" + KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
    + KEY_Expense + " TEXT NOT NULL, " + KEY_Amount + " TEXT NOT NULL);";