Issues with displaying data from SQLite database i

2019-06-13 15:29发布

问题:

I need help in how to retrieve data from SQLite database and put into spinner. Plus, I can't open my android app and the LogCat says "No such column:name". I have even check with my DBAdapter classes and non-DBAdapter classes.

I have two DBAdapter classes(InfoDBAdapter.java and BuddiesDBAdapter.java) both link to my PersonalInfo.java class.

Below are the codes for retrieving data from database and put into spinner(PersonalInfo.class).

InfoDBAdapter infoDB = new InfoDBAdapter(this);

//BuddiesDBAdapter buddyDB = new BuddiesDBAdapter(this);

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
setContentView(R.layout.info);

BuddiesDBAdapter buddyDB = new BuddiesDBAdapter(this);

buddyDB.open();
Cursor c = buddyDB.getAllContacts();

//Create an array to specify which fields want to display
    String[] from = new String[] {"name"};

    //Create an array of the display item want to bind our data to
    int[] to = new int[] {R.id.fName};

    nameSpinner = (Spinner) findViewById(R.id.nameSpinner);

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, c, from, to);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    nameSpinner.setAdapter(adapter);

    buddyDB.close();

and these are the insert codes for inserting informaton into database.

btnSave = (Button) findViewById(R.id.btnSave);
        btnSave.setOnClickListener(new View.OnClickListener()
            {

                @Override
                public void onClick(View v)
                {
                    infoDB.open();
                    long id;

                    Spinner nameSpinner = (Spinner) findViewById(R.id.nameSpinner);
                    String NameValue = nameSpinner.getSelectedItem().toString();

                    EditText txtDate = (EditText) findViewById(R.id.txtDate);
                    String DateValue = txtDate.getText().toString();

                    EditText txtType = (EditText) findViewById(R.id.txtType);
                    String TypeValue = txtType.getText().toString();

                    EditText txtLikes = (EditText) findViewById(R.id.txtLikes);
                    String LikesValue = txtLikes.getText().toString();

                    EditText txtDislikes = (EditText) findViewById(R.id.txtDislikes);
                    String DislikesValue = txtDislikes.getText().toString();

                    id = infoDB.insertContact(NameValue, DateValue, TypeValue, LikesValue, DislikesValue);
                    infoDB.close();

                    Toast.makeText(getBaseContext(), 
                            "Your information is saved successfully!", Toast.LENGTH_SHORT).show();

                }
            });

Below are the two DBAdapter classes

InfoDBAdapter.java

public class InfoDBAdapter
{
    public static final String KEY_ROWID = "_id";
    public static final String KEY_NAME = "name";
    public static final String KEY_DATE = "date";
    public static final String KEY_TYPE = "type";
    public static final String KEY_LIKES = "likes";
    public static final String KEY_DISLIKES = "dislikes";

    private static final String TAG = "InfoDBAdapter";

    private static final String DATABASE_NAME = "anniversary";
    private static final String DATABASE_TABLE = "friends";
    private static final int DATABASE_VERSION = 2;

    private static final String DATABASE_CREATE = "create table friends(_id integer primary key autoincrement, "
            + "name text not null, date text not null, type text not null, likes text not null, dislikes text not null);";

    private final Context context;

    private DatabaseHelper DBHelper;
    private SQLiteDatabase db;

    public InfoDBAdapter(Context ctx)
    {
        this.context = ctx;
        DBHelper = new DatabaseHelper(context);
    }

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

        @Override
        public void onCreate(SQLiteDatabase db)
        {
            try
            {
                db.execSQL(DATABASE_CREATE);
            } catch (SQLException e)
            {
                e.printStackTrace();
            }
        }// end onCreate()

        @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 friends");
            onCreate(db);
        }// end onUpgrade()

    }// end DatabaseHelper

        public InfoDBAdapter open() throws SQLException
        {
            db = DBHelper.getWritableDatabase();
            return this;
        }// end open()

        public void close()
        {
            DBHelper.close();
        }// end close()

        public long insertContact(String name, String date, String type, String likes, String dislikes)
        {
            ContentValues initialValues = new ContentValues();
            initialValues.put(KEY_NAME, name);
            initialValues.put(KEY_DATE, date);
            initialValues.put(KEY_TYPE, type);
            initialValues.put(KEY_LIKES, likes);
            initialValues.put(KEY_DISLIKES, dislikes);
            return db.insert(DATABASE_TABLE, null, initialValues);
        }// end insertContact()

        public boolean deleteContact(long rowId)
        {
            return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
        }// end deleteContact()

        public Cursor getAllContacts()
        {
            return db.query(DATABASE_TABLE, new String[] 
                    { KEY_ROWID, KEY_NAME, KEY_DATE, KEY_TYPE, KEY_LIKES, KEY_DISLIKES }, null, null, null, null, null);
        }// end getAllContacts()

        public Cursor getContact(long rowId) throws SQLException
        {
            Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {
                    KEY_ROWID, KEY_NAME, KEY_DATE, KEY_TYPE, KEY_LIKES, KEY_DISLIKES }, KEY_ROWID + "=" + rowId,
                    null, null, null, null, null);
            if (mCursor != null)
            {
                mCursor.moveToFirst();
            }
            return mCursor;
        }// end getContact()

        public boolean updateContact(long rowId, String name, String date, String type, String likes, String dislikes)
        {
            ContentValues args = new ContentValues();
            args.put(KEY_NAME, name);
            args.put(KEY_DATE, date);
            args.put(KEY_TYPE, type);
            args.put(KEY_LIKES, likes);
            args.put(KEY_DISLIKES, dislikes);
            return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
        }// end updateContact()
}//end DBAdapter

BuddiesDBAdapter.java

public class BuddiesDBAdapter
{
    public static final String KEY_ROWID = "_id";
    public static final String KEY_NAME = "buddy_name";
    private static final String TAG = "BuddiesDBAdapter";

    private static final String DATABASE_NAME = "anniversary";
    private static final String DATABASE_TABLE = "buddiesList";
    private static final int DATABASE_VERSION = 2;

    private static final String DATABASE_CREATE = "create table namesList(_id integer primary key autoincrement, "
            + "buddy_name text not null);";

    private final Context context;

    private DatabaseHelper DBHelper;
    private SQLiteDatabase db;

    public BuddiesDBAdapter(Context ctx)
    {
        this.context = ctx;
        DBHelper = new DatabaseHelper(context);
    }

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

        @Override
        public void onCreate(SQLiteDatabase db)
        {
            try
            {
                db.execSQL(DATABASE_CREATE);
            } catch (SQLException e)
            {
                e.printStackTrace();
            }
        }// end onCreate()

        @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 namesList");
            onCreate(db);
        }// end onUpgrade()

    }//end DatabaseHelper class

    public BuddiesDBAdapter open() throws SQLException
    {
        db = DBHelper.getWritableDatabase();
        return this;
    }// end open()

    public void close()
    {
        DBHelper.close();
    }// end close()

    public long insertContact(String buddy_name)
    {
        ContentValues values = new ContentValues();
        values.put(KEY_NAME, buddy_name);
        return db.insert(DATABASE_TABLE, null, values);         
    }//end insertContact()


    public boolean deleteContact(long rowId)
    {
        return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
    }// end deleteContact()


    public Cursor getAllContacts()
    {
        return db.query(DATABASE_TABLE, new String[] 
                { KEY_ROWID, KEY_NAME }, null, null, null, null, null);
    }// end getAllContacts()

    public Cursor getContact(long rowId) throws SQLException
    {
        Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {
                KEY_ROWID, KEY_NAME }, KEY_ROWID + "=" + rowId,
                null, null, null, null, null);
        if (mCursor != null)
        {
            mCursor.moveToFirst();
        }
        return mCursor;
    }// end getContact()

    public boolean updateContact(long rowId, String buddy_name)
    {
        ContentValues args = new ContentValues();
        args.put(KEY_NAME, buddy_name);
        return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
    }//end updateContact()
}

I need help with this. Any help would be appreciated. Thanks alot!

回答1:

The above answer is correct. What is confusing is that you have two different db adapters and the table name/column names are different.

For maintainability, I would not hard code the column names, but instead use

String[] from = new String[] {BuddiesDBAdapter.KEY_NAME};

Hope this helps...



回答2:

Because

   String[] from = new String[] {"name"};

should be

   String[] from = new String[] {"buddy_name"};