показать данные в моем приложении для Android (сохранение теперь работает нормально) - PullRequest
0 голосов
/ 04 февраля 2011

эй, Теперь я могу сохранить данные в моей базе данных, но они не отображаются в самой деятельности базы данных.

@ Override public void onCreate (BundlevedInstanceState) { 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;
    }

}

Это оператор вставки

{

                        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 ]

0 голосов
/ 11 февраля 2011

ОК, вот как я это делаю:

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>

Я расширяю CursorAdapter, чтобы создать или повторно-использовать существующие ListActivity строки (предоставленные ListActivity), определенные в row.xml.bindView используется, если Android хочет, чтобы вы повторно использовали существующий ресурс строки, newView используется, если хочет, чтобы вы создали новый:

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 - это просто вспомогательный классдля хранения Java-представления строки, которую я связываю с элементом ListActivity с setTag выше.Не обязательно самый элегантный способ, но он упрощает вещи.: * 10101 *

    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 в моем onCreate из ListActivity:

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, который я показал выше.Я говорю ListActivity использовать этот адаптер, чтобы я мог правильно заполнять строки.getAllInventory является членом BarcodeHelper, который переопределяет SQLiteOpenHelper:

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

Вспомогательный объект просто содержит набор вспомогательных функций.

Все это основано на 1040 * превосходное учебное пособие по Android от CommonsWare, которое я не могу порекомендовать, но здесь должно быть достаточно, чтобы начать работу.

0 голосов
/ 04 февраля 2011

Я думаю, что в запросе вставки отсутствует слово 'values'. Попробуйте напечатать эту строку запроса на консоли, выполнив то же самое через консоль на БД. Это может помочь вам определить ошибку.

0 голосов
/ 04 февраля 2011

У меня есть две вещи, на которые стоит обратить внимание:

Что такое i в вашем запросе SQL? Это int? Если это так, это может быть проблемой, потому что, как вы используете его, это должно быть String.

Во-вторых, почему бы вам не использовать вспомогательную функцию insert в 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 );

Это снимает всю сложность построения запроса SQL с вставки строк - это гарантирует, что запрос правильно построен, все, что вам нужно сделать, это правильно построить карту ContentValues.

0 голосов
/ 04 февраля 2011

Пожалуйста, предоставьте больше информации. Как в журнале ошибок. Ошибка может быть в самом утверждении. Сначала добавьте детали из logcat. Это уточнит.

...