问题
hey, now i can save data in my db, but it doesn't show up in the database activity itself.
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); onCreateDBAndDBTabled(); //DB und Tables erstellen wenn noch nicht vorhanden setContentView(R.layout.main); }
private void onCreateDBAndDBTabled() {
myDB = this.openOrCreateDatabase(MY_DB_NAME, Context.MODE_PRIVATE, null);
myDB.execSQL("CREATE TABLE IF NOT EXISTS " + MY_DB_TABLE
+ " ( id integer primary key autoincrement,"+
"Name varchar(100),"+
"Comment varchar(128),"+
"BookingDetails varchar(255),"+
"CustomerProject integer(3),"+
"editable varchar(15))"
+";");
}
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, MENU_PROJECTS, 0, R.string.menuProjects)
.setShortcut('1', 'f')
.setIcon(R.drawable.icon);
return true;
}
public boolean onOptionsItemSelected(MenuItem item){
switch (item.getItemId()) {
case MENU_PROJECTS:
Intent iProjects = new Intent(this, Projects.class);
startActivity(iProjects);
return true;
}
return false;
}
}
This is the insert statement
{
ContentValues cv = new ContentValues();
cv.put ( "Name", Name.getText().toString() );
cv.put ( "Comment", Comment.getText().toString() );
cv.put ( "BookingDetails", BookingDetails.getText().toString() );
cv.put ( "Project_kind", i );
cv.put ( "Editable", Editable.getText().toString() );
myDB.insert ( Projectshome.MY_DB_TABLE , null, cv);
}
finish();
return true;
this is my manifest:
</manifest>
here is my LogCat-output the moment i hit the save-button:
02-09 11:41:53.850: ERROR/Database(719): Error inserting BookingDetails=BookingDetails Project_kind=0 Name=Name Editable=Editable Comment=Comment
02-09 11:41:53.850: ERROR/Database(719): android.database.sqlite.SQLiteException: table projects has no column named Project_kind: , while compiling: INSERT INTO projects(BookingDetails, Project_kind, Name, Editable, Comment) VALUES(?, ?, ?, ?, ?);
02-09 11:41:53.850: ERROR/Database(719): at android.database.sqlite.SQLiteProgram.native_compile(Native Method)
02-09 11:41:53.850: ERROR/Database(719): at android.database.sqlite.SQLiteProgram.compile(SQLiteProgram.java:110)
02-09 11:41:53.850: ERROR/Database(719): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59)
02-09 11:41:53.850: ERROR/Database(719): at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:41)
02-09 11:41:53.850: ERROR/Database(719): at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:925)
02-09 11:41:53.850: ERROR/Database(719): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1300)
02-09 11:41:53.850: ERROR/Database(719): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1173)
02-09 11:41:53.850: ERROR/Database(719): at versuch.datenbank.Projects_New.onOptionsItemSelected(Projects_New.java:132)
02-09 11:41:53.850: ERROR/Database(719): at android.app.Activity.onMenuItemSelected(Activity.java:2085)
02-09 11:41:53.850: ERROR/Database(719): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:820)
02-09 11:41:53.850: ERROR/Database(719): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:139)
02-09 11:41:53.850: ERROR/Database(719): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:813)
02-09 11:41:53.850: ERROR/Database(719): at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:519)
02-09 11:41:53.850: ERROR/Database(719): at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122)
02-09 11:41:53.850: ERROR/Database(719): at android.view.View.onTouchEvent(View.java:3828)
02-09 11:41:53.850: ERROR/Database(719): at android.widget.TextView.onTouchEvent(TextView.java:6291)
02-09 11:41:53.850: ERROR/Database(719): at android.view.View.dispatchTouchEvent(View.java:3368)
02-09 11:41:53.850: ERROR/Database(719): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
02-09 11:41:53.850: ERROR/Database(719): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863)
02-09 11:41:53.850: ERROR/Database(719): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1691)
02-09 11:41:53.850: ERROR/Database(719): at android.view.ViewRoot.handleMessage(ViewRoot.java:1525)
02-09 11:41:53.850: ERROR/Database(719): at android.os.Handler.dispatchMessage(Handler.java:99)
02-09 11:41:53.850: ERROR/Database(719): at android.os.Looper.loop(Looper.java:123)
02-09 11:41:53.850: ERROR/Database(719): at android.app.ActivityThread.main(ActivityThread.java:3948)
02-09 11:41:53.850: ERROR/Database(719): at java.lang.reflect.Method.invokeNative(Native Method)
02-09 11:41:53.850: ERROR/Database(719): at java.lang.reflect.Method.invoke(Method.java:521)
02-09 11:41:53.850: ERROR/Database(719): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
02-09 11:41:53.850: ERROR/Database(719): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
02-09 11:41:53.850: ERROR/Database(719): at dalvik.system.NativeStart.main(Native Method)
hope you can help me again :)
回答1:
Please provide more information. As in the error log. The error might be in the statement itself.Add the details from the logcat first.It will clarify.
回答2:
I think the insert query is missing word 'values'. Try printing that query string on console executing the same through console on db. That may help you identify error.
回答3:
I have two things to point out:
What is i
in your SQL query? Is it an int
? If so that might be the problem because the way you are using it, it should be a String
.
Secondly, why don't you use the insert
convenience function of SQLiteDatabase?
ContentValues cv = new ContentValues();
cv.put ( "Name", Name.getText().toString() );
cv.put ( "Comment", Comment.getText().toString() );
cv.put ( "BookingDetails", BookingDetails.getText().toString() );
cv.put ( "Project_kind", i );
cv.put ( "Editable", Editable.getText().toString() );
myDB.insert ( Projectshome.MY_DB_TABLE, null, cv );
This takes all the complexity of building the SQL query out of inserting rows - it will ensure that the query is correctly built, all you have to do is build the ContentValues
map properly.
回答4:
OK, so here's how I do it:
row.xml (Used for each row in the list view):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="4px"
>
<LinearLayout
android:id="@+id/LinearLayout01"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_vertical"
android:textStyle="bold"
android:singleLine="true"
android:ellipsize="end"
android:id="@+id/itemDescription"/>
<TextView
android:text="@+id/TextView01"
android:id="@+id/Category"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
</LinearLayout>
<LinearLayout
android:id="@+id/LinearLayout01"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="fill_parent"
android:text="@+id/TextView01"
android:gravity="center_vertical"
android:layout_weight="1"
android:singleLine="true"
android:ellipsize="end"
android:id="@+id/itemManufacturer"
android:layout_height="wrap_content">
</TextView>
<TextView
android:text="@+id/TextView01"
android:id="@+id/EAN"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</TextView>
</LinearLayout>
</LinearLayout>
I extend CursorAdapter
to create or re-use existing ListActivity
rows (supplied by the ListActivity
) defined in row.xml. bindView
is used if Android wants you to re-use an existing row resource, newView
is used if it wants you to create a new one:
class BarcodeAdapter extends CursorAdapter {
BarcodeAdapter(Cursor c) {
super(kitchenListInventoryActivity.this, c);
}
@Override
public void bindView(View row, Context ctxt,
Cursor c) {
BarcodeHolder holder=(BarcodeHolder)row.getTag();
holder.populateFrom(c, helper);
}
@Override
public View newView(Context ctxt, Cursor c,
ViewGroup parent) {
LayoutInflater inflater=getLayoutInflater();
View row = null;
row = inflater.inflate(R.layout.row, parent, false);
BarcodeHolder holder=new BarcodeHolder(row);
row.setTag(holder);
return(row);
}
}
BarcodeHolder
is just a convenience class to hold a Java representation of the row, which I associate with the ListActivity
item with setTag
above. Not necessarily the most elegant way, but it simplifies things.:
static class BarcodeHolder {
private TextView description=null;
private TextView manufacturer=null;
private TextView EAN = null;
private TextView category = null;
private View row=null;
BarcodeHolder(View row) {
this.row=row;
description=(TextView)row.findViewById(R.id.itemDescription);
manufacturer=(TextView)row.findViewById(R.id.itemManufacturer);
EAN=(TextView)row.findViewById(R.id.EAN);
category = ( TextView )row.findViewById(R.id.Category);
}
void populateFrom(Cursor c, BarcodeHelper helper) {
Cursor invCursor = helper.getByInventoryEAN(helper.getBarcode(c));
Cursor dbCursor = helper.getByEAN(helper.getBarcode(c));
dbCursor.moveToFirst();
invCursor.moveToFirst();
int qty = helper.getQuantity ( invCursor );
String desc = helper.getDescription(dbCursor) + " (" + String.valueOf( qty ) + ")" ;
description.setText( desc );
manufacturer.setText(helper.getManufacturer(dbCursor));
category.setText(helper.getCategory(dbCursor));
}
}
To bring this all together, I call initList
in my onCreate
of the ListActivity
:
private void initList ( ) {
if ( model != null ) {
stopManagingCursor(model);
model.close();
}
model = helper.getAllInventory();
startManagingCursor(model);
adapter = new BarcodeAdapter(model);
setListAdapter(adapter);
}
model
is a Cursor
, and adapter
is an instance of BarcodeAdapter
, which I've shown above. I tell the ListActivity
to use this adapter so that I can correctly populate the rows. getAllInventory
is a member of BarcodeHelper
which overrides SQLiteOpenHelper
:
public Cursor getAllInventory( ) {
String sql = "SELECT _id, EAN, quantity FROM Inventory ORDER BY EAN";
return(getReadableDatabase().rawQuery(sql, null));
}
The helper object just contains a collection of convenience functions.
All of this is based on CommonsWare's excellent Android tutorial book which I cannot recommend enough, but there should be enough here to get you going.
来源:https://stackoverflow.com/questions/4897800/show-data-in-my-android-appsaving-works-just-fine-now