Android Notepad教程修改 - 应用程序在启动时意外停止 - 布局/查看问题?

时间:2011-07-23 01:54:07

标签: android sqlite android-layout android-listview

我正在尝试从Android开发人员指南中修改记事本教程,但我的应用程序在启动时意外停止。这是我的代码:

我的主要方法叫做启动......

public class MyList extends ListActivity
{
  private MyListDBAdapter listDBHelper;

  /** Called when the activity is first created. */
  @Override
  public void onCreate (Bundle savedInstanceState)
  {
    super.onCreate (savedInstanceState);
    setContentView (R.layout.home_layout);

    listDBHelper = new MyListDBAdapter (this);
    listDBHelper.open ();
    fillData ();

    Button btnAddItem = (Button) findViewById (R.id.add_item_button);
    btnAddItem.setOnClickListener (new OnClickListener()
    {
      @Override
      public void onClick (View v)
      {
        Intent goToAddItem = new Intent (MyList.this,AddItem.class);
        startActivity(goToAddItem); 
      }
    });
  }

  private void fillData ()
  {
    // Get all of the items from the database and create the item list
    Cursor allItems = listDBHelper.fetchAllItems ();
    startManagingCursor (allItems);

    String [] from = new String [] {MyListDBAdapter.FIELD_ATTR1,
                                    MyListDBAdapter.FIELD_ATTR2,
                                    MyListDBAdapter.FIELD_ATTR3};
    int [] to = new int [] {R.id.list_attr1, R.id.list_attr2,
                    R.id.list_attr3};

    // Now create an array adapter and set it to display using the item_record_view layout
    SimpleCursorAdapter items = new SimpleCursorAdapter(this,R.layout.item_record_view,
                                                        allItems, from, to);
    setListAdapter(items);
  }
}

其布局XML文件......

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id = "@+id/home_layout"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
xmlns:android = "http://schemas.android.com/apk/res/android">
<Button android:id = "@+id/add_item_button"
        android:layout_width = "fill_parent"
        android:layout_height = "wrap_content"
        android:text = "@string/add_item"/>
<ListView android:id = "@android:id/list"
          android:layout_width = "wrap_content"
          android:layout_height = "wrap_content"/>
<TextView android:id = "@android:id/empty"
          android:layout_width = "wrap_content"
          android:layout_height = "wrap_content"
          android:text = "@string/no_items"/>   
</LinearLayout>

...和我正试图用来显示我的项目的ListView ......

<?xml version="1.0" encoding="utf-8"?>
<ListView
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:id = "@+id/list_attr1"
          android:layout_width = "wrap_content"
          android:layout_height = "wrap_content"
          android:layout_alignParentLeft = "true"
          xmlns:android="http://schemas.android.com/apk/res/android"/>
<TextView android:id = "@+id/list_attr2"
          android:layout_width = "wrap_content"
          android:layout_height = "wrap_content"
          android:paddingLeft = "60dip"
          xmlns:android="http://schemas.android.com/apk/res/android"/>
<TextView android:id = "@+id/list_attr3"
          android:layout_width = "wrap_content"
          android:layout_height = "wrap_content"
          android:paddingLeft = "160dip"
          android:gravity = "left"
          xmlns:android="http://schemas.android.com/apk/res/android"/>
</ListView>

MyListDBAdapter的代码......

public class MyListDBAdapter
{
  private static final String TABLE_ITEMS = "MyList";
  public static final String FIELD_RECORD_ID = "_ID";
  public static final String FIELD_TYPE = "Type";
  public static final String FIELD_ATTR1 = "Attr1";
  public static final String FIELD_ATTR2 = "Attr2";
  public static final String FIELD_ATTR3 = "Attr3";
  public static final String FIELD_MY_RATING = "MyRating";
  public static final String [] COLUMNS = {FIELD_RECORD_ID, FIELD_TYPE, FIELD_ATTR1,
                                           FIELD_ATTR2, FIELD_ATTR3};

  private static final String TAG = "MyListDBHelper";
  private DatabaseHelper listDBHelper;
  private SQLiteDatabase itemDB;

  /**
   * Database creation sql statement
   */
  private static final String DATABASE_CREATE = ("CREATE TABLE IF NOT EXISTS " +
                                                 TABLE_ITEMS + " (" + FIELD_RECORD_ID +
                                                 " INTEGER PRIMARY KEY AUTOINCREMENT,"
                                                 + FIELD_TYPE + " TEXT NOT NULL, " +
                                                 FIELD_ATTR1 + " INTEGER NOT NULL, " +
                                                 FIELD_ATTR2 + " TEXT" + " NOT NULL,"
                                                 + FIELD_ATTR3 + " TEXT NOT NULL," +
                                                 FIELD_MY_RATING + " INTEGER);");

  private static final String DATABASE_NAME = "Items";
  private static final int DATABASE_VERSION = 1;

  private final Context thisContext;

  private static class DatabaseHelper extends SQLiteOpenHelper
  {
    DatabaseHelper (Context context)
    {
      super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate (SQLiteDatabase db)
    {
      db.execSQL(DATABASE_CREATE);
    }

    @Override
    public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion)
    {
      Log.w (TAG, "Upgrading database from version " + oldVersion + " to "
             + newVersion + ", which will destroy all old data");
      db.execSQL("DROP TABLE IF EXISTS notes");
      onCreate(db);
    }
  }

    /**
     * Constructor - takes the context to allow the database to be
     * opened/created
     * 
     * @param context the Context within which to work
     */
     public MyListDBAdapter (Context context)
     {
       this.thisContext = context;
     }

    /**
     * Open the items database. If it cannot be opened, try to create a new
     * instance of the database. If it cannot be created, throw an exception to
     * signal the failure
     * 
     * @return this (self reference, allowing this to be chained in an
     *         initialization call)
     * @throws SQLException if the database could be neither opened or created
     */
     public MyListDBAdapter open () throws SQLException
     {
       listDBHelper = new DatabaseHelper (thisContext);
       itemsDB = listDBHelper.getWritableDatabase ();
       return this;
     }

     public void close ()
     {
       listDBHelper.close ();
     }

     /**
      * Create a new item entry using the information provided. If the item is
      * successfully created return the new record ID for that item, otherwise return
      * a -1 to indicate failure.
      * 
      * @param Type the type of the item
      * @param attr1
      * @param attr2
      * @param attr3
      * @return rowId or -1 if failed
      */
      public long addItem (String type, int attr1, String attr2, String attr3)
      {
       ContentValues initialValues = new ContentValues ();
       initialValues.put (FIELD_TYPE, type);
       initialValues.put (FIELD_ATTR1, attr1);
       initialValues.put (FIELD_ATTR2, attr2);
       initialValues.put (FIELD_ATTR3, attr3);

       return itemsDB.insert (TABLE_ITEMS, null, initialValues);
      }

      public long addItem (String type, int attr1, String attr2, String attr3,
                           int myRating)
      {
       ContentValues initialValues = new ContentValues ();
       initialValues.put (FIELD_TYPE, type);
       initialValues.put (FIELD_ATTR1, attr1);
       initialValues.put (FIELD_ATTR2, attr2);
       initialValues.put (FIELD_ATTR3, attr3);
       initialValues.put (FIELD_MY_RATING, myRating);

       return itemsDB.insert (TABLE_ITEMS, null, initialValues);
      }

      /**
       * Delete the item with the given record ID
       * 
       * @param _ID ID of item to delete
       * @return true if deleted, false otherwise
       */
       public boolean deleteItem (long recordID)
       {
         return (itemsDB.delete (TABLE_ITEMS, FIELD_RECORD_ID + "=" + recordID,
                 null) > 0);
       }

       /**
        * Return a Cursor over the list of all items in the database
        * 
        * @return Cursor over all notes
        */
        public Cursor fetchAllItems ()
        {
          return itemsDB.query (TABLE_ITEMS, COLUMNS, null, null, null, null, null);
        }

        /**
         * Return a Cursor positioned at the item that matches the given record ID
         * 
         * @param _ID ID of item to retrieve
         * @return Cursor positioned to matching item, if found
         * @throws SQLException if item could not be found/retrieved
         */
         public Cursor fetchItem (long recordID) throws SQLException
         {
           Cursor itemCursor = itemsDB.query (true, TABLE_ITEMS, COLUMNS,
                      FIELD_RECORD_ID + "=" + recordID, null, null, null, null, null);
           if (itemCursor != null)
           {
             itemCursor.moveToFirst();
           }

           return itemCursor;
         }

         /**
          * Update the item using the details provided. The item to be updated is
          * specified using the record ID, and it is altered to use the values passed in
          * 
          * @param _ID ID of item to update
          * @param type type value to set item type to
          * @param attr1
          * @param attr2
          * @param attr3
          * @return true if the item was successfully updated, false otherwise
          */
          public boolean updateItem (long recordID, String type, int attr1,
                                     String attr2, String attr3)
          {
            ContentValues editVals = new ContentValues ();
            editVals.put (FIELD_TYPE, type);
            editVals.put (FIELD_ATTR1, attr1);
            editVals.put (FIELD_ATTR2, attr2);
            editVals.put (FIELD_ATTR3, attr3);

            return (itemsDB.update (TABLE_ITEMS, editVals, FIELD_RECORD_ID + "=" +
                    recordID, null) > 0);
          }
}

我认为问题不在于我的AddItem类或其关联的布局,我真的不喜欢格式化这篇文章的代码。任何人都可以帮我看看出了什么问题吗?

1 个答案:

答案 0 :(得分:1)

您必须将FIELD_RECORD_ID中的MyListDBAdapter重命名为 _id

  

Cursor必须包含名为“_id”的列,否则此类将不起作用。

文档here