在我的Andr​​oid应用程序的数据显示(保存现在工作得很好) [英] show data in my android app(saving works just fine now)

查看:141
本文介绍了在我的Andr​​oid应用程序的数据显示(保存现在工作得很好)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

哎,
现在我可以在我的数据库保存数据,但它并没有在数据库活动本身显示出来。

hey, now i can save data in my db, but it doesn't show up in the database activity itself.

@覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        onCreateDBAndDBTabled(); // DB UND表ERSTELLEN德恩NOCH nicht vorhanden
        的setContentView(R.layout.main);
    }

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

}

这是插入语句

{

                        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中输出我打的保存按钮的那一刻:

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

推荐答案

好了,这里就是我如何做到这一点:

OK, so here's how I do it:

row.xml(在列表视图用于各行):

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>

我延长的CursorAdapter 以创建或重新使用现有的 ListActivity 行(通过 ListActivity )的定义row.xml。 bindView Android是否要你被用于重新使用现有的行资源, NewView的如果要你用创建一个新的:

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

酒吧codeHolder 仅仅是一个方便的类持有该行的一个Java重新presentation,我与关联的 setTag 上面ListActivity 项。并不一定是最优雅的方式,但它简化了的东西:

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

要带来这一切在一起,我称之为 initList 在我的的onCreate ListActivity的

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

模式光标适配器酒吧codeAdapter ,我已经如上图所示的一个实例。我告诉 ListActivity 来使用此适配器,这样我可以正确填充行。 getAllInventory 酒吧codeHelper 它覆盖的成员 SQLiteOpenHelper

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.

这一切是基于 CommonsWare的优秀的Andr​​oid教程的书,我不能建议不够,而是应该有足够这里让你走。

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.

这篇关于在我的Andr​​oid应用程序的数据显示(保存现在工作得很好)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆