Android 无法从SQLite数据库中读取。尝试从游标检索数据时,“活动”崩溃

Android 无法从SQLite数据库中读取。尝试从游标检索数据时,“活动”崩溃,android,Android,显示第二个活动的数据时出现问题。 当我从第二个活动运行getData方法时,它将崩溃 Dabase类 public static final String KEY_ROWID = "ExpenseID"; public static final String KEY_Expense = "ExpenseDescription"; public static final String KEY_Amount = "Amount"; private static f

显示第二个活动的数据时出现问题。 当我从第二个活动运行getData方法时,它将崩溃

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

每次我点击查看第二个活动时,应用程序都会崩溃

我想你可以尝试替换

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();
    }
}
BudgetInfo info = new BudgetInfo(this);

并可尝试使用:

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);";
您的姓名和声明文本之间可能没有空格

你可以试试这个:

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

我想你可以试着换一个

BudgetInfo info = new BudgetInfo(this);

并可尝试使用:

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);";
您的姓名和声明文本之间可能没有空格

你可以试试这个:

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

这里有几件事你得先试试。我假设您在上一个活动中将数据插入到ure表中

  • 检查数据库是否正确创建

  • 检查数据库中是否有数据

  • 还要检查光标是否不为null,并为movetofirst()返回true。(即使您从其他帖子获得解决方案,您也必须这样做)

  • 完成光标操作后,请始终关闭光标。我看不出你在这里这么做


  • 这里有几件事你得先试试。我假设您在上一个活动中将数据插入到ure表中

  • 检查数据库是否正确创建

  • 检查数据库中是否有数据

  • 还要检查光标是否不为null,并为movetofirst()返回true。(即使您从其他帖子获得解决方案,您也必须这样做)

  • 完成光标操作后,请始终关闭光标。我看不出你在这里这么做


  • 您在数据库中的何处执行插入???您可以粘贴崩溃日志猫信息吗?您在数据库中的何处执行插入???您可以粘贴崩溃日志猫信息吗?