как сохранить несколько столбцов и отобразить список из одного столбца?

Эй, я пытаюсь использовать базу данных с помощью помощника базы данных. Я могу записывать данные в соответствии с тостом, но всякий раз, когда я получаю запись для просмотра списка, приложение перестает работать. Пожалуйста, кто-нибудь может помочь. Это код для MainActivity.java

package com.example.dhruv.bills;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import java.util.ArrayList;
public class bills extends AppCompatActivity {
DBAdapter dbAdapter;
ListView mrecycleview;
private static final String TAG ="bills";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bills);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    mrecycleview =(ListView) findViewById(R.id.mRecycleView);
    dbAdapter = new DBAdapter(this);
    // mlistview();
    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent i = new Intent(getApplicationContext(),Editbills.class);
            startActivity(i);
        }
    });
   // mlistview();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_bills, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
 /* private void mlistview(){
    Log.d(TAG,"mlistview:Display data in listview");
    Cursor mCursor = dbAdapter.getAllRecords();
    ArrayList<String> listData = new ArrayList<>();
    while (mCursor.moveToNext()){
        listData.add(mCursor.getString(1));
    }
    ListAdapter adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,listData);
    mrecycleview.setAdapter(adapter);
}*/
}

это код для DbAdapter, который я использовал для сохранения и чтения базы данных и отображения ее в списке.

package com.example.dhruv.bills;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBAdapter {
public static final String KEY_ROWID = "id";
public static final String KEY_TITLE = "title";
public static final String KEY_DUEDATE = "duedate";
public static final String KEY_COURSE = "course";
// public static final String KEY_NOTES = "notes";
private static final String TAG = "DBAdapter";

private static final String DATABASE_NAME = "billsdb";
private static final String DATABASE_TABLE = "bills";
private static final int DATABASE_VERSION = 2;

private static final String DATABASE_CREATE =
    "create table if not exists assignments (id integer primary key autoincrement, "
    + "title VARCHAR not null, duedate date, course VARCHAR );";

private final Context context;    

private DatabaseHelper DBHelper;
private SQLiteDatabase db;

public DBAdapter(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();
        }
    }

    @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 contacts");
        onCreate(db);
    }
}    

//---opens the database---
public DBAdapter open() throws SQLException 
{
    db = DBHelper.getWritableDatabase();
    return this;
}

//---closes the database---    
public void close() 
{
    DBHelper.close();
}

//---insert a record into the database---
public long insertRecord(String title, String duedate, String course) 
{
    ContentValues initialValues = new ContentValues();
    initialValues.put(KEY_TITLE, title);
    initialValues.put(KEY_DUEDATE, duedate);
    initialValues.put(KEY_COURSE, course);
    return db.insert(DATABASE_TABLE, null, initialValues);
}

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

//---retrieves all the records---
public Cursor getAllRecords()
{SQLiteDatabase db = DBHelper.getWritableDatabase();
String query ="SELECT * FROM" + DATABASE_TABLE;
Cursor data = db.rawQuery(query,null);
    return data;
}

//---retrieves a particular record---
public Cursor getRecord()
{String query1 ="SELECT * FROM" + KEY_TITLE;
    Cursor mCursor = db.rawQuery(query1,null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor;
}

//---updates a record---
public boolean updateRecord(long rowId, String title, String duedate, String course) 
{
    ContentValues args = new ContentValues();
    args.put(KEY_TITLE, title);
    args.put(KEY_DUEDATE, duedate);
    args.put(KEY_COURSE, course);
    return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
}
}

это logcat кода, который я получаю, пожалуйста, помогите

03-24 01:16:22.787 1096-1096/com.example.dhruv.bills E/AndroidRuntime: FATAL EXCEPTION: main
                                                                   Process: com.example.dhruv.bills, PID: 1096
                                                                   java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.dhruv.bills/com.example.dhruv.bills.bills}: android.database.sqlite.SQLiteException: near "FROMbills1": syntax error (code 1): , while compiling: SELECT * FROMbills1
                                                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2656)
                                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2721)
                                                                       at android.app.ActivityThread.access$900(ActivityThread.java:168)
                                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                       at android.os.Looper.loop(Looper.java:135)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:5753)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at java.lang.reflect.Method.invoke(Method.java:372)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)
                                                                    Caused by: android.database.sqlite.SQLiteException: near "FROMbills1": syntax error (code 1): , while compiling: SELECT * FROMbills1
                                                                       at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                                                                       at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1093)
                                                                       at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:670)
                                                                       at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
                                                                       at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59)
                                                                       at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
                                                                       at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
                                                                       at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1454)
                                                                       at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1393)
                                                                       at com.example.dhruv.bills.DBAdapter.getAllRecords(DBAdapter.java:98)
                                                                       at com.example.dhruv.bills.bills.mlistview(bills.java:68)
                                                                       at com.example.dhruv.bills.bills.onCreate(bills.java:42)
                                                                       at android.app.Activity.performCreate(Activity.java:6112)
                                                                       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1117)
                                                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2609)
                                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2721) 
                                                                       at android.app.ActivityThread.access$900(ActivityThread.java:168) 
                                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) 
                                                                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                       at android.os.Looper.loop(Looper.java:135) 
                                                                       at android.app.ActivityThread.main(ActivityThread.java:5753) 
                                                                       at java.lang.reflect.Method.invoke(Native Method) 
                                                                       at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405) 
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200) 

person dhruv sachdeva    schedule 23.03.2018    source источник
comment
пожалуйста, предоставьте лог-кат, чтобы ошибки были идентифицированы ›   -  person Niamatullah Bakhshi    schedule 23.03.2018
comment
@NiamatullahBakhshi, как теперь прикрепить logcat?   -  person dhruv sachdeva    schedule 23.03.2018
comment
попробуйте отредактировать свой вопрос, вы должны увидеть там значок галереи во время редактирования.   -  person Niamatullah Bakhshi    schedule 23.03.2018
comment
@NiamatullahBakhshi прикреплен, пожалуйста, проверьте   -  person dhruv sachdeva    schedule 23.03.2018
comment
Следите за своими пространствами! {String query1 ="SELECT * FROM" + KEY_TITLE;   -  person Phantômaxx    schedule 24.03.2018
comment
@KlingKlang да, теперь все работает отлично. спасибо за помощь брат.   -  person dhruv sachdeva    schedule 24.03.2018
comment
@NiamatullahBakhshi stackoverflow.com/questions/49497655/ не могли бы вы ответить на этот вопрос, это было бы очень полезно   -  person dhruv sachdeva    schedule 27.03.2018


Ответы (1)


Вы пропустили пробел между ключевым словом FROM и таблицей bills1, то есть в SQL есть FROMbills1 вместо FROM bills1 (см. ниже имя таблицы)< /сильный>.

Глядя на ваш код, у вас есть два метода, которые следует изменить. Вместо :-

//---retrieves all the records---
public Cursor getAllRecords()
{SQLiteDatabase db = DBHelper.getWritableDatabase();
String query ="SELECT * FROM" + DATABASE_TABLE;
Cursor data = db.rawQuery(query,null);
    return data;
}

//---retrieves a particular record---
public Cursor getRecord()
{String query1 ="SELECT * FROM" + KEY_TITLE;
    Cursor mCursor = db.rawQuery(query1,null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor;
}

вы могли бы: -

//---retrieves all the records---
public Cursor getAllRecords()
{SQLiteDatabase db = DBHelper.getWritableDatabase();
String query ="SELECT * FROM " + DATABASE_TABLE; //<<<< space added after FROM
Cursor data = db.rawQuery(query,null);
    return data;
}

//---retrieves a particular record---
public Cursor getRecord()
{String query1 ="SELECT * FROM " + KEY_TITLE; //<<<< space added after FROM
    Cursor mCursor = db.rawQuery(query1,null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor;
}
  • Обратите внимание, что второй метод завершится ошибкой, так как KEY_TITLE, который преобразуется в title, не является таблицей.

Из предоставленного кода я не могу понять, как вы получили имя таблицы bills1, поскольку DATABASE_TABLE определяется как bills. Кроме того, ваш код создает только таблицу с именем assignments в соответствии с: -

private static final String DATABASE_CREATE =
    "create table if not exists assignments (id integer primary key autoincrement, "
    + "title VARCHAR not null, duedate date, course VARCHAR );";

Я бы предложил использовать только один источник для имен таблиц и столбцов во всем коде. Это в значительной степени устранило бы проблемы.


Дополнительный

При ближайшем рассмотрении есть дополнительные проблемы с классом DBAdapter, вот переписанная версия, которая включает единое определение имен таблиц и столбцов, а также устраняет эти проблемы (см. комментарии): -

public class DBAdapter {
    public static final String KEY_ROWID = "id";
    public static final String KEY_TITLE = "title";
    public static final String KEY_DUEDATE = "duedate";
    public static final String KEY_COURSE = "course";
    // public static final String KEY_NOTES = "notes";
    private static final String TAG = "DBAdapter";

    private static final String DATABASE_NAME = "billsdb";
    private static final String DATABASE_TABLE = "bills";
    private static final int DATABASE_VERSION = 2;

    private static final String DATABASE_CREATE =
            "create table if not exists assignments (id integer primary key autoincrement, "
                    + "title VARCHAR not null, duedate date, course VARCHAR );";

    // Replaces DATABASE_CREATE using the one source definition
    private static final String TABLE_CREATE =
            "CREATE TABLE IF NOT EXISTS " + DATABASE_TABLE + "(" +
                    KEY_ROWID + " INTEGER PRIMARY KEY, " + // AUTOINCREMENT NOT REQD
                    KEY_TITLE + " DATE NOT NULL, " +
                    KEY_DUEDATE + " DATE ," +
                    KEY_COURSE + " VARCHAR " +
                    ")";

    private final Context context;

    private DatabaseHelper DBHelper;
    private SQLiteDatabase db;

    public DBAdapter(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)
        {
            db.execSQL(TABLE_CREATE); // NO need to encapsulate in try clause
        }

        @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 contacts"); //????????
            db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
            onCreate(db);
        }
    }

    //---opens the database---
    public DBAdapter open() throws SQLException
    {
        db = DBHelper.getWritableDatabase();
        return this;
    }

    //---closes the database---
    public void close()
    {
        DBHelper.close();
    }

    //---insert a record into the database---
    public long insertRecord(String title, String duedate, String course)
    {
        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_TITLE, title);
        initialValues.put(KEY_DUEDATE, duedate);
        initialValues.put(KEY_COURSE, course);
        //return db.insert(DATABASE_TABLE, null, initialValues);
        // Will return NULL POINTER EXCEPTION as db isn't set
        // Replaces commented out line
        return DBHelper.getWritableDatabase().insert(DATABASE_TABLE,
                null,
                initialValues
        );
    }

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

    //---retrieves all the records--- SEE FOLLOWING METHOD
    public Cursor getAllRecords()
    {SQLiteDatabase db = DBHelper.getWritableDatabase();
        String query ="SELECT * FROM " + DATABASE_TABLE;
        Cursor data = db.rawQuery(query,null);
        return data;
    }

    //As per getAllRecords but using query convenience method
    public Cursor getAllAsCursor() {
        return DBHelper.getWritableDatabase().query(
                DATABASE_TABLE,
                null,null,null,null,null,null
        );
    }

    //---retrieves a particular record--- THIS WILL NOT WORK - NO SUCH TABLE
    public Cursor getRecord()
    {String query1 ="SELECT * FROM" + KEY_TITLE;
        Cursor mCursor = db.rawQuery(query1,null);
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;
    }

    // Retrieve a row (single) according to id
    public Cursor getRecordById(long id) {
        return DBHelper.getWritableDatabase().query(
                DATABASE_TABLE,
                null,
                KEY_ROWID + "=?",
                new String[]{String.valueOf(id)},
                null,null,null
                );
    }


    //---updates a record---
    public boolean updateRecord(long rowId, String title, String duedate, String course)
    {
        ContentValues args = new ContentValues();
        args.put(KEY_TITLE, title);
        args.put(KEY_DUEDATE, duedate);
        args.put(KEY_COURSE, course);
        String whereclause = KEY_ROWID + "=?";
        String[] whereargs = new String[]{String.valueOf(rowId)};
        // Will return NULL POINTER EXCEPTION as db isn't set
        //return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
        // Replaces commented out line
        return DBHelper.getWritableDatabase().update(DATABASE_TABLE,
                args,
                whereclause,
                whereargs
        ) > 0;
    }
}

Приведенный выше код был протестирован (по крайней мере, вставка и извлечение данных) с использованием следующего кода: -

public class MainActivity extends AppCompatActivity {

    DBAdapter mDBAdapter;
    Cursor mCsr;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mDBAdapter = new DBAdapter(this);
        addSomeData();

        mCsr = mDBAdapter.getAllAsCursor();
        while (mCsr.moveToNext()) {
            Log.d("BILLDATA",
                    "Title="+mCsr.getString(mCsr.getColumnIndex(DBAdapter.KEY_TITLE)) +
                            " Due Date=" + mCsr.getString(mCsr.getColumnIndex(DBAdapter.KEY_DUEDATE)) +
                            " Course=" + mCsr.getString(mCsr.getColumnIndex(DBAdapter.KEY_COURSE))
            );
        }
        mCsr.close();
    }

    // Add some data (note will add 3 rows each time it is run)
    private void addSomeData() {
        mDBAdapter.insertRecord("Bill1","2018-10-02","English");
        mDBAdapter.insertRecord("Bill2","2018-09-03","Mathematics");
        mDBAdapter.insertRecord("Bill3","2018-11-04", "Geography");
    }
}

Вывод в журнал (после 3-го запуска): -

03-23 21:34:10.164 1644-1644/so49457069bills.so49457069bills D/BILLDATA: Title=Bill1 Due Date=2018-10-02 Course=English
03-23 21:34:10.164 1644-1644/so49457069bills.so49457069bills D/BILLDATA: Title=Bill2 Due Date=2018-09-03 Course=Mathematics
03-23 21:34:10.164 1644-1644/so49457069bills.so49457069bills D/BILLDATA: Title=Bill3 Due Date=2018-11-04 Course=Geography
03-23 21:34:10.164 1644-1644/so49457069bills.so49457069bills D/BILLDATA: Title=Bill1 Due Date=2018-10-02 Course=English
03-23 21:34:10.164 1644-1644/so49457069bills.so49457069bills D/BILLDATA: Title=Bill2 Due Date=2018-09-03 Course=Mathematics
03-23 21:34:10.164 1644-1644/so49457069bills.so49457069bills D/BILLDATA: Title=Bill3 Due Date=2018-11-04 Course=Geography
03-23 21:34:10.164 1644-1644/so49457069bills.so49457069bills D/BILLDATA: Title=Bill1 Due Date=2018-10-02 Course=English
03-23 21:34:10.164 1644-1644/so49457069bills.so49457069bills D/BILLDATA: Title=Bill2 Due Date=2018-09-03 Course=Mathematics
03-23 21:34:10.164 1644-1644/so49457069bills.so49457069bills D/BILLDATA: Title=Bill3 Due Date=2018-11-04 Course=Geography

ПРИМЕЧАНИЕ

Я настоятельно рекомендую после внесения изменений удалить приложение или очистить данные приложения перед его запуском. Это приведет к удалению базы данных, которая затем будет создана заново, а затем вызовет метод onCreate помощника базы данных.

person MikeT    schedule 23.03.2018
comment
спасибо брат работает отлично. Спасибо за вашу помощь. - person dhruv sachdeva; 24.03.2018
comment
@dhruvsachdeva это хорошо. Не могли бы вы отметить вопрос как ответ. - person MikeT; 24.03.2018
comment
Готово брат. ???? - person dhruv sachdeva; 24.03.2018
comment
пожалуйста, ответьте и на этот вопрос. stackoverflow.com/questions/49497655/ - person dhruv sachdeva; 27.03.2018