【问题标题】:Android app inserting and displaying data in a ListViewAndroid 应用在 ListView 中插入和显示数据
【发布时间】:2017-08-04 11:58:29
【问题描述】:

我正在制作一个应用程序,癫痫症用户可以在其中将有关他们最近癫痫发作的信息存储到 SQLite 数据库中,并通过 ListView 在另一个活动中显示查看这些信息。当我按下提交数据按钮并且按下任何按钮或选项卡将我带到他们可以查看任何记录的页面(ActivityDiary)时,该应用程序将停止在模拟器上运行。

在 logcat 中,我遇到了一个严重的 RuntimeException .. 这里 FATAL EXCEPTION: main 进程:com.example.administrator.seizuretrack,PID:2783

android.database.sqlite.SQLiteException: near "TimeTEXTDescriptionTEXT": syntax error (code 1): , while compiling: CREATE TABLE diary_table (ID INTEGER PRIMARY KEY AUTOINCREMENT,Date TEXT TimeTEXTDescriptionTEXT

提交数据的活动:

public class RecordSeizuresActivity extends AppCompatActivity {

    /**instantiating the floating button objects**/
    FloatingActionButton homeBut;
    FloatingActionButton seizureBut;
    FloatingActionButton diaryBut;
    DatabaseHelper myDB;

    /**instantiate the objects for database handling**/
    private Button butAddData, butViewData;
    private EditText dateText, timeText, desText;

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

        /************Database code in onCreate method*************************/
        /**Create an instance of Database Helper class, call the constructor**/
        myDB = new DatabaseHelper(this);
        dateText = (EditText) findViewById(R.id.dateText);
        timeText = (EditText) findViewById(R.id.timeText);
        desText = (EditText) findViewById(R.id.desText);
        butAddData = (Button) findViewById(R.id.butAddData);
        butViewData = (Button) findViewById(R.id.butViewData);

        myDB = new DatabaseHelper(this);

        butAddData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String getDate = dateText.getText().toString();
                String getTime = timeText.getText().toString();
                String getDescription = desText.getText().toString();

                if (dateText.length() != 0 && timeText.length() != 0 && desText.length() != 0){

                    AddData(getDate, getTime, getDescription);
                    /**reset the text boxes so that they are blank**/
                    dateText.setText(" ");
                    timeText.setText(" ");
                    desText.setText(" ");

                } else {
                    Toast.makeText(getApplicationContext(), "Please enter all fields!", Toast.LENGTH_LONG).show();
                }
            }
        });

            butViewData.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view){
                Intent intent = new Intent(RecordSeizuresActivity.this,ActivityDiary.class);
                startActivity(intent);
            }
        });
    }

    public void AddData(String getDate, String getTime, String getDescription){
        boolean insertData = myDB.AddData(getDate, getTime, getDescription);

        if (insertData == true){
            Toast.makeText(getApplicationContext(), "Successfully Entered A New Seizure Record!", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(getApplicationContext(), "Something went wrong", Toast.LENGTH_LONG).show();
        }
    }

DatabaseHelper: 
public class DatabaseHelper extends SQLiteOpenHelper {

    private static final String TAG = "DatabaseHelper";
    public static final String DATABASE_NAME = "SeizureTrack.db";
    public static final String TABLE_NAME = "diary_table";

    public static final String COL_1 = "ID";
    public static final String COL_2 = "Date";
    public static final String COL_3 = "Time";
    public static final String COL_4 = "Description";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, 1);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT,"
                + COL_2 + " TEXT " + COL_3 + "TEXT" + COL_4 + "TEXT");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }

    public boolean AddData(String item, String item2, String item3) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(COL_2, item);
        contentValues.put(COL_3, item2);
        contentValues.put(COL_4, item3);

        Log.d(TAG, "AddData: Adding " + item + item2 + item3 + " to " + TABLE_NAME);
        long result = db.insert(TABLE_NAME, null, contentValues);

        /**if data is inserted incorrectly it will return -1**/
        if (result == -1){
            return false;
        } else {
            return true;
        }
    }

    public Cursor getListContents() {
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor data = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
        return data;
    }
}

activity for viewing the data: 

public class ActivityDiary extends AppCompatActivity {
    FloatingActionButton homeBut;
    FloatingActionButton seizureBut;
    FloatingActionButton diaryBut;

    DatabaseHelper myDB;
    ArrayList<User> userList;
    ListView listView;
    User user;

    /**instantiate the objects for database handling**/

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

        Toast.makeText(getApplicationContext(), "Diary", Toast.LENGTH_LONG).show();

        homeBut = (FloatingActionButton)findViewById(R.id.floatingHomeButton);
        homeBut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(ActivityDiary.this, HomeActivity.class));
            }
        });
        seizureBut = (FloatingActionButton)findViewById(R.id.floatingRecSeizuresButton);
        seizureBut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(ActivityDiary.this, RecordSeizuresActivity.class));
            }
        });
        diaryBut = (FloatingActionButton)findViewById(R.id.floatingDiaryButton);
        diaryBut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(ActivityDiary.this, ActivityDiary.class));
            }
        });

        /************Database code in onCreate method*************************/
        /**Create an instance of Database Helper class, call the constructor**/
        myDB = new DatabaseHelper(this);

        userList = new ArrayList<>();
        Cursor data = myDB.getListContents();

        int numRows = data.getCount();
        if(numRows == 0){
            /**handles all NullPointerExceptions**/
            Toast.makeText(ActivityDiary.this, "You No Have Seizures On Record!", Toast.LENGTH_LONG).show();
        } else {
            while (data.moveToNext()) {
                user = new User(data.getString(1), data.getString(2), data.getString(3));
                userList.add(user);
            }

            ThreeColumn_ListAdapter adapter = new ThreeColumn_ListAdapter(this, R.layout.adapter_view_layout, userList);
            listView = (ListView) findViewById(R.id.listView);
            listView.setAdapter(adapter);
        }
    }
}

List adapter class: 

public class ThreeColumn_ListAdapter extends ArrayAdapter<User> {
    private LayoutInflater uInflater;
    private ArrayList<User> users;
    private int uViewResourceId;


    public ThreeColumn_ListAdapter(Context context, int textViewResourceId, ArrayList<User> users){
        super(context, textViewResourceId, users);
        this.users = users;
        uInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        uViewResourceId = textViewResourceId;
    }
    public View getView(int position, View convertView, ViewGroup parents){
        User user = users.get(position);

        if(user != null){
            TextView getDes = (TextView) convertView.findViewById(R.id.textSeizureType);
            TextView getDate = (TextView) convertView.findViewById(R.id.textDate);
            TextView getTime = (TextView) convertView.findViewById(R.id.textTime);

            if(getDes != null){
                getDes.setText((user.getDescription()));
            }
            if(getDate != null){
                getDate.setText((user.getDate()));
            }
            if(getTime != null){
                getTime.setText((user.getTime()));
            }
        }
        return convertView;
    }
}

Manifest file: 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.administrator.seizuretrack">

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".LoginActivity1"
            android:label="@string/title_activity_login1"
            android:parentActivityName=".MainActivity"
            android:theme="@style/AppTheme.NoActionBar">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.example.administrator.seizuretrack.MainActivity" />

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".HomeActivity" />
        <activity android:name=".AboutActivity"/>
        <activity android:name=".RecordSeizuresActivity"/>
        <activity android:name=".ActivitySettings"/>
        <activity android:name=".ActivityDiary"/>
    </application>
</manifest>

【问题讨论】:

  • 您在创建查询中忘记了一些逗号

标签: android sqlite listview


【解决方案1】:

更新您的 db.execSQL 查询 像这样

 String CREATE_BILL_TABLE = "CREATE TABLE "
            + TABLE_NAME +
            "("
            + id +
            " INTEGER PRIMARY KEY AUTOINCREMENT,"
            + COL_2 +
            " TEXT,"
            + COL_3 +
            " TEXT,"
            + COL_4 + " TEXT" + ")";      


    db.execSQL(CREATE_BILL_TABLE);

【讨论】:

  • @DonalLane;升级您的数据库版本或从设备上卸载您的应用并再次运行该应用
  • @NileshRathod;如果你编辑你的答案会很好,它包括让应用程序重新运行这个 SQL 语句所需的步骤
  • 我忘记了我的朋友忙于一些工作,非常感谢您的 cmets
  • 感谢工作,我将 id 更改为 COL_1,它显示了表示插入成功的 toast。但是当我按下视图时,我仍然无法在应用程序停止的下一个活动中查看数据按钮
  • 引起:com.google.android.apps.gsa.shared.exception.GsaIOException:错误代码:393238 |缓冲区溢出,没有可用空间。这就是原因,我认为这与我之前做过的插入有关,而 Layout 或 ListView 中没有空间来显示它们?我说的对吗?
【解决方案2】:

最好考虑使用一些 ORM 而不是直接使用 SQLite。 有一些变体:

1) 领域:https://realm.io/docs/java/latest/#getting-started

2) 绿道:http://greenrobot.org/greendao/documentation/updating-to-greendao-3-and-annotations/

3) 等等……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-07
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多