показать данные в моем приложении для Android (теперь сохранение работает нормально)

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

@Override public void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); onCreateDBAndDBTabled (); // DB и таблицы 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)

надеюсь, ты снова сможешь мне помочь :)


person Sam    schedule 04.02.2011    source источник
comment
что такое журнал? , вывод logcat?   -  person sat    schedule 04.02.2011
comment
ну у меня нет ... это моя вторая проблема на данный момент ...   -  person Sam    schedule 04.02.2011
comment
как насчет разрешений на использование в манифесте?   -  person AndyAndroid    schedule 04.02.2011
comment
Я думаю, вам следует удалить точку с запятой, указанную в конце запроса.   -  person Shashank_Itmaster    schedule 04.02.2011
comment
Я разместил свой манифест в отредактированном вопросе. если чего-то не хватает, я был бы более чем признателен, если бы вы мне сказали;)   -  person Sam    schedule 04.02.2011
comment
Как ваше приложение прерывается? Это принудительное закрытие? Он просто исчезает? Если вы опубликуете свой onClick, мы сможем узнать немного больше. Вы уверены, что нет вывода logcat? Я спрашиваю, потому что даже для приложения, которое вообще не выдает ошибок, от Android будет вывод logcat, относящийся к тому, что происходит - у вас, по крайней мере, будут сообщения GC, сообщения, когда ваши действия начнутся ...   -  person RivieraKid    schedule 04.02.2011


Ответы (4)


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

person Gaurav Navgire    schedule 04.02.2011

Я думаю, что в запросе на вставку отсутствует слово «значения». Попробуйте распечатать эту строку запроса на консоли, выполнив то же самое через консоль на db. Это может помочь вам определить ошибку.

person Ashwini Shahapurkar    schedule 04.02.2011
comment
Вы пытались распечатать строку запроса на консоли. Также проверьте, есть ли файл traces.txt в папке data / data / anr. Иногда журнал попадает в этот файл. - person Ashwini Shahapurkar; 04.02.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 карту.

person RivieraKid    schedule 04.02.2011
comment
спасибо, теперь он больше не прерывается;) но он также не отображается в списке / my db ... очень странно ... - person Sam; 09.02.2011
comment
Как вы пытаетесь получить данные из базы данных? Вы используете курсор, чтобы указать на данные? Адаптер, чтобы связать его со списком? Вам также потребуется предоставить код для управления созданием и повторным использованием представлений, чтобы Android мог эффективно управлять вашими ресурсами. Я поставлю еще один ответ с примером кода, когда смогу - должно быть примерно на следующий день. - person RivieraKid; 10.02.2011
comment
На самом деле, просто присмотревшись к вашему выводу logcat, в вашем исходном вопросе упоминался ProjectKind, вероятно, как переменная, и я взял это как имя столбца. Из вашего кода создания вы должны изменить Project_kind на CustomerProject - person RivieraKid; 10.02.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 выше. Не обязательно самый элегантный способ, но он упрощает:

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

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

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

person RivieraKid    schedule 10.02.2011