TL; DR:我认为我在android studio中的SQLite数据库中正确使用put()
和insert()
。
编辑:我也得到这个例外,所以我认为我的错误是在创建数据库的某个地方
E/SQLiteLog: (1) table yarns has no column named _id
我正在使用SQLite数据库制作库存应用程序。但是,似乎我的插入不是向每列添加数据。我的数据库处理程序具有所有必需品,例如表的命名,列,数据库版本。
这是我的DBHandlers onCreate(),我是按照教程制作的。
// Database Version
private static final int DATABASE_VERSION = 2;
// Database Name
private static final String DATABASE_NAME = "yarnInfo.db";
// Contacts table name
private static final String TABLE_NAME = "yarns";
// Shops Table Columns names
private static final String KEY_ID = "_id";
private static final String KEY_BRAND_NAME = "brand_name";
private static final String KEY_YARN_NAME = "yarn_name";
private static final String KEY_COLOR = "color";
private static final String KEY_FIBER = "fiber";
private static final String KEY_BALLS_AVAILABLE = "balls_available";
private static final String KEY_YARDAGE = "yardage";
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_NAME + "("
+ KEY_ID + " INTEGER PRIMARY KEY,"
+ KEY_BRAND_NAME + " TEXT, "
+ KEY_YARN_NAME + " TEXT, "
+ KEY_COLOR + " TEXT, "
+ KEY_FIBER + " TEXT, "
+ KEY_BALLS_AVAILABLE + " DOUBLE, "
+ KEY_YARDAGE + " DOUBLE " + ")";
db.execSQL(CREATE_CONTACTS_TABLE);
}
在我的数据库处理程序中添加数据库功能。
public void addYarn(Yarn yarn) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_ID,yarn.getID());
values.put(KEY_BRAND_NAME, yarn.getBrandName()); // Yarn Brand Name
values.put(KEY_YARN_NAME, yarn.getYarnName()); // Yarn Name
//db.insert(TABLE_NAME, null, values);
values.put(KEY_COLOR, yarn.getColor()); // Yarn Color
values.put(KEY_FIBER, yarn.getFiber()); // Yarn Fiber
values.put(KEY_BALLS_AVAILABLE, yarn.getBallsAvailable());
values.put(KEY_YARDAGE, yarn.getYardage()); // Yarn yardage
db.insert(TABLE_NAME, null, values);
}
如果我在纱线名称和纱线颜色之间取消注释第一个db.insert(...),我可以读取品牌名称和纱线名称。
使用我的数据库处理程序,这就是我在mainActivity
中添加纱线的方式。
myDB.addYarn(new Yarn(1, "Red Heart", "Comfy", "Red", "100% Acrylic", 5.3, 400.0));
myDB.addYarn(new Yarn(2, "Baron", "Baby", "Blue", "100% Acrylic", 3, 400.0));
myDB.addYarn(new Yarn(3, "Knit Picks", "Lux", "Purple", "100% Silk", 2, 50));
我正在使用“brand_name - yarn_name”显示纱线的列表视图。但我不能添加颜色,纤维或其他任何东西。这个功能在我的mainActivity
中,并填充listView。
public void refreshDB() {
final ListView listView = (ListView) findViewById(R.id.listView);
ArrayList<String> theList = new ArrayList<>();
final Cursor data = myDB.getCursor();
Toast.makeText(this, "count:" + myDB.findLastID(), Toast.LENGTH_LONG).show();
if (data.getCount() == 0) {
Toast.makeText(this, "There are no contents in this list!", Toast.LENGTH_LONG).show();
} else {
while (data.moveToNext()) {
theList.add(data.getString(1) + " - " + data.getString(2));
ListAdapter listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_expandable_list_item_1, theList);
listView.setAdapter(listAdapter);
}
}
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(MainActivity.this, yarnView.class);
intent.putExtra("key", position);
startActivity(intent);
}
});
}
同样,当我取消注释db.insert(...)时,我得到插入的纱线列表和“count = 3”的吐司。当我按原样离开时,我得到一个“count = 0”而没有列表。我也无法在列表中添加其他列。 (我的onclicklistener也没有工作,如果您发现任何问题...我想将ID发送到另一个活动以显示有关纱线的更多细节)
E.g。这不起作用,应用程序崩溃。
theList.add(data.getString(1) + " - " + data.getString(2)" - " + data.getString(3));
所以我不认为插入是在所有列中添加。如果它不在这里我的问题可能在哪里?
感谢您的帮助。