0

データベースにデータを保存できるようになりましたが、データベース アクティビティ自体には表示されません。

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); onCreateDBAndDBTabled(); //DB と 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;
    }

}

これが挿入文です

{

                        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> 

保存ボタンを押した瞬間の LogCat 出力は次のとおりです。

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)

あなたが再び私を助けてくれることを願っています:)

4

4 に答える 4

0

OK、これが私のやり方です:

row.xml(リストビューの各行に使用されます):

<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>

row.xmlで定義されている既存の行(によって提供される)CursorAdapterを作成または再利用するように拡張します。Androidで既存の行リソースを再利用する場合に使用され、新しい行リソースを作成する場合に使用されます。ListActivityListActivitybindViewnewView

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

BarcodeHolderListActivityは、行のJava表現を保持するための便利なクラスであり、上記の項目に関連付けていますsetTag。必ずしも最もエレガントな方法ではありませんが、それは物事を単純化します。

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

これをすべてまとめるために、私initListは自分onCreateListActivity:を呼び出します

private void initList ( ) {
    if ( model != null ) {
        stopManagingCursor(model);
        model.close();
    }

    model = helper.getAllInventory();
    startManagingCursor(model);
    adapter = new BarcodeAdapter(model);
    setListAdapter(adapter);
}

modelは、Cursorであり、上記で示しadapterたのインスタンスです。行を正しく入力できるように、このアダプターを使用するようBarcodeAdapterに指示します。そのメンバーはオーバーライドします:ListActivitygetAllInventoryBarcodeHelperSQLiteOpenHelper

public Cursor getAllInventory( ) {
    String sql = "SELECT _id, EAN, quantity FROM Inventory ORDER BY EAN";
    return(getReadableDatabase().rawQuery(sql, null));
}

ヘルパーオブジェクトには、便利な関数のコレクションが含まれているだけです。

これはすべて、CommonsWareの優れたAndroidチュートリアルブックに基づいており、私はこれを十分に推奨することはできませんが、ここで十分に理解できるはずです。

于 2011-02-10T23:38:00.277 に答える
0

詳細情報を提供してください。エラーログのように。エラーはステートメント自体にある可能性があります。最初に logcat から詳細を追加します。明確になります。

于 2011-02-04T12:25:52.397 に答える
0

挿入クエリに「値」という単語が欠落していると思います。そのクエリ文字列をコンソールに出力して、db のコンソールから同じコマンドを実行してみてください。これは、エラーの特定に役立つ場合があります。

于 2011-02-04T12:49:32.310 に答える
0

指摘したいことが2つあります。

iSQL クエリには何が含まれていますか? それはintですか?使用方法が原因で問題になる可能性がある場合は、String.

次に、insertSQLiteDatabase の便利な機能を使用してみませんか?

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

これにより、行の挿入から SQL クエリを構築する複雑さがすべて取り除かれます。これにより、クエリが正しく構築されることが保証されます。必要なのは、ContentValuesマップを適切に構築することだけです。

于 2011-02-04T15:51:40.143 に答える