sqlite ERROR中的多个表

时间:2013-03-07 20:25:52

标签: android sqlite listview

我正在尝试将数据插入到A.class中的listview中 数据将来自B.class的编辑文本 我有2张桌子 这是我的代码

这是我的DbAdapter

public class SQLiteAdapter extends Search{

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.row);
}

public static final String APP_NAME = "AdvancedSearch";
public static final String MYDATABASE_NAME = "Food_DB";
public static final String MYDATABASE_TABLE = "Food_Table";
public static final int MYDATABASE_VERSION = 1;

public static final String KEY_ID = "_id";
public static final String KEY_FOODNAME = "FoodName";
public static final String KEY_CALORIES = "Calories";

public static final String FOODLOG = "Food_tab";
public static final String ID = "_id";
public static final String FOODNAME = "FoodName";
public static final String CALORIES = "Calories";

//create table MY_DATABASE (ID integer primary key, Content text not null);

private static final String SCRIPT_CREATE_DATABASE =
        "create table " + MYDATABASE_TABLE + " ("
                + KEY_ID + " integer primary key autoincrement, "
                + KEY_FOODNAME + " text not null, " + 
                KEY_CALORIES + " integer);";

private static final String CREATE_FOODLOG =
        "create table " + FOODLOG + " ("
                + ID + " integer primary key autoincrement, "
                + FOODNAME + " text not null, " + 
                CALORIES + " integer);";


private SQLiteHelper sqLiteHelper;
private SQLiteDatabase sqLiteDatabase;

private Context context;

public SQLiteAdapter(Context c){
    context = c;
}

public SQLiteAdapter openToRead() throws android.database.SQLException {
    sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
    sqLiteDatabase = sqLiteHelper.getReadableDatabase();
    return this;
}

public SQLiteAdapter openToWrite() throws android.database.SQLException {
    sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
    sqLiteDatabase = sqLiteHelper.getWritableDatabase();
    return this;
}

public void close()
{
    sqLiteHelper.close();
}

public long insert(String foodname, int i){
    ContentValues contentValues = new ContentValues();
    contentValues.put(KEY_FOODNAME, foodname);
    contentValues.put(KEY_CALORIES, i);
    return sqLiteDatabase.insert(MYDATABASE_TABLE, null, contentValues);    

}

public long insert1(String food, String cal){
    ContentValues Values = new ContentValues();
    Values.put(FOODNAME, food);
    Values.put(CALORIES, cal);
    return sqLiteDatabase.insert(FOODLOG, null, Values);    

}

public int deleteAll(){
    return sqLiteDatabase.delete(MYDATABASE_TABLE, null, null);
}

public Cursor queueAll(){
    String[] columns = new String[]{KEY_ID, KEY_FOODNAME, KEY_CALORIES};
    Cursor cursor = sqLiteDatabase.query(MYDATABASE_TABLE, columns,
            null, null, null, null, null);

    return cursor;
}

public Cursor queueFoodLog(){
    String[] columns = new String[]{ID, FOODNAME, CALORIES};
    Cursor cursor = sqLiteDatabase.query(FOODLOG, columns,
            null, null, null, null, null);

    return cursor;
}
 public void update_byID(int id, String v1, String v2){
      ContentValues values = new ContentValues();
      values.put(KEY_FOODNAME, v1);
      values.put(KEY_CALORIES, v2);
      sqLiteDatabase.update(MYDATABASE_TABLE, values, KEY_ID+"="+id, null);
     }


public class SQLiteHelper extends SQLiteOpenHelper {

    public SQLiteHelper(Context context, String name,
            CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL(SCRIPT_CREATE_DATABASE);
        db.execSQL(CREATE_FOODLOG);
    }


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    }

        }


public void open()
{
    sqLiteDatabase = sqLiteHelper.getWritableDatabase();
}

public void delete_byID(int item_id) {
    // TODO Auto-generated method stub
    sqLiteDatabase.delete(MYDATABASE_TABLE, KEY_ID, null);
}


}

这是我试图获取数据的代码。我的B.class

 private ListView.OnItemClickListener listContentOnItemClickListener = new ListView.OnItemClickListener(){
  public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
       Cursor cursor = (Cursor) parent.getItemAtPosition(position);

      String item_content1 = cursor.getString(cursor.getColumnIndex(SQLiteAdapter.KEY_FOODNAME));
      String item_content2 = cursor.getString(cursor.getColumnIndex(SQLiteAdapter.KEY_CALORIES));
      arlene = arlene + Integer.parseInt(item_content2);
      String item = String.valueOf(" Food Name: " + item_content1 ) + "\n" +
              " Calories: " +  item_content2;

       Toast.makeText(Search.this, item, Toast.LENGTH_LONG).show();      

       food.setText(item_content1);
       calories.setText(String.valueOf(arlene));


       String data1 = food.getText().toString();
       String data2 = calories.getText().toString();
       mySQLiteAdapter.insert1(data1, data2);
       updateList();
    }

这是我的A.class,我试图调用插入B.class

中的数据
          mySQLiteAdapter = new SQLiteAdapter(this);
          mySQLiteAdapter.openToRead();

          Cursor cursor = mySQLiteAdapter.queueAll();
          startManagingCursor(cursor);

          String[] from = new String[]{SQLiteAdapter.FOODNAME,SQLiteAdapter.CALORIES};
          int[] to = new int[]{R.id.tv3, R.id.tv4};

          SimpleCursorAdapter cursorAdapter =
           new SimpleCursorAdapter(this, R.layout.foodlist, cursor, from, to);
          foodlog.setAdapter(cursorAdapter);

这是我的LOGCAT

03-08 03:58:06.068: E/AndroidRuntime(27320): FATAL EXCEPTION: main
03-08 03:58:06.068: E/AndroidRuntime(27320): java.lang.IllegalStateException: database not open
03-08 03:58:06.068: E/AndroidRuntime(27320):    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1493)
03-08 03:58:06.068: E/AndroidRuntime(27320):    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1410)
03-08 03:58:06.068: E/AndroidRuntime(27320):    at me.mojica.caloriewatch.SQLiteAdapter.insert1(SQLiteAdapter.java:88)
03-08 03:58:06.068: E/AndroidRuntime(27320):    at me.mojica.caloriewatch.Search$1.onItemClick(Search.java:230)
03-08 03:58:06.068: E/AndroidRuntime(27320):    at android.widget.AdapterView.performItemClick(AdapterView.java:284)
03-08 03:58:06.068: E/AndroidRuntime(27320):    at android.widget.ListView.performItemClick(ListView.java:3382)
03-08 03:58:06.068: E/AndroidRuntime(27320):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696)
03-08 03:58:06.068: E/AndroidRuntime(27320):    at android.os.Handler.handleCallback(Handler.java:587)
03-08 03:58:06.068: E/AndroidRuntime(27320):    at android.os.Handler.dispatchMessage(Handler.java:92)
03-08 03:58:06.068: E/AndroidRuntime(27320):    at android.os.Looper.loop(Looper.java:123)
03-08 03:58:06.068: E/AndroidRuntime(27320):    at android.app.ActivityThread.main(ActivityThread.java:4627)
03-08 03:58:06.068: E/AndroidRuntime(27320):    at java.lang.reflect.Method.invokeNative(Native Method)
03-08 03:58:06.068: E/AndroidRuntime(27320):    at java.lang.reflect.Method.invoke(Method.java:521)
03-08 03:58:06.068: E/AndroidRuntime(27320):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-08 03:58:06.068: E/AndroidRuntime(27320):    at     com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-08 03:58:06.068: E/AndroidRuntime(27320):    at dalvik.system.NativeStart.main(Native Method)

请帮助

1 个答案:

答案 0 :(得分:1)

更改

String data1 = food.getText().toString();
String data2 = calories.getText().toString();
mySQLiteAdapter.insert1(data1, data2);
updateList();  

String data1 = food.getText().toString();
String data2 = calories.getText().toString();
mySQLiteAdapter.open();
mySQLiteAdapter.insert1(data1, data2);
mySQLiteAdapter.close();
updateList();