2017-05-31 67 views
0

這是我的MainActivity.java文件。我試圖創建一個簡單的應用程序來輸入學生姓名,然後使用其他兩個類DatabaseManager.java和Students.java將其存儲在數據庫中。問題是,無論何時我嘗試運行該應用程序並單擊添加按鈕,應用程序都會凍結,並在AppLogCat中顯示下面的錯誤。SQLite數據庫圖形錯誤

MainActivity.java

package com.example.android.dbms; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 
EditText inputText; 
TextView outputText; 
DatabaseManager manager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    inputText = (EditText)findViewById(R.id.dataEntryText); 
    outputText = (TextView)findViewById(R.id.textView); 
    manager = new DatabaseManager(this,null,null,1); 
    printDatabase(); 
} 

public void onAddButtonClick(View view){ 
    String studentName = inputText.getText().toString(); 
    Students student = new Students(studentName); 
    manager.addStudent(student); 
    printDatabase(); 
} 

public void onDeleteButtonClick(View view){ 
    String studentName = inputText.getText().toString(); 
    manager.deleteStudent(studentName); 
    printDatabase(); 
} 

public void printDatabase(){ 
    String dbString; 
    dbString = manager.databaseToString(); 
    outputText.setText(dbString); 
    inputText.setText(""); 
} 


} 

Students.java

package com.example.android.dbms; 



public class Students { 
private int _id; 
private String _studentname; 

public Students(){} 

public Students(String _studentname) { 
    this._studentname = _studentname; 
} 

public int get_id() { 
    return _id; 
} 

public void set_id(int _id) { 
    this._id = _id; 
} 

public String get_studentname() { 
    return _studentname; 
} 

public void set_studentname(String _studentname) { 
    this._studentname = _studentname; 
} 
} 

DatabaseManager.java

package com.example.android.dbms; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 




public class DatabaseManager extends SQLiteOpenHelper { 

private static final int DATABASE_VERSION = 1; 
private static final String DATABASE_NAME = "students.db"; 
private static final String TABLE_STUDENTS = "students"; 
private static final String COLUMN_ID ="_id"; 
private static final String COLUMN_STUDENTNAME = "_studentname"; 

public DatabaseManager(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { 
    super(context, DATABASE_NAME, factory, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    String query = "CREATE TABLE "+ TABLE_STUDENTS + " ("+ 
      COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"+ 
      COLUMN_STUDENTNAME + " TEXT);"; 
    db.execSQL(query); 
} 

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

//add a new row to the database 

public void addStudent(Students students){ 
    ContentValues values = new ContentValues(); 
    values.put(COLUMN_STUDENTNAME,students.get_studentname()); 
    SQLiteDatabase db = getWritableDatabase(); 
    db.insert(TABLE_STUDENTS,null,values); 
    db.close(); 
} 

//delete a row from the table 

public void deleteStudent(String studentName){ 
    SQLiteDatabase db = getWritableDatabase(); 
    db.execSQL("DELETE FROM " + TABLE_STUDENTS + " WHERE " + COLUMN_STUDENTNAME + "=\"" + studentName + "\" ;"); 
} 

//print out the database as string 

public String databaseToString(){ 
    String dbString = ""; 
    SQLiteDatabase db = getWritableDatabase(); 
    String query = "SELECT * FROM "+ TABLE_STUDENTS + " WHERE 1;"; 

    //Cursor point to locate data in table 
    Cursor c = db.rawQuery(query,null); 
    c.moveToFirst(); 

    while (!c.isAfterLast()){ 
     if(c.getString(c.getColumnIndex("_studentname"))!=null){ 
      dbString += c.getString(c.getColumnIndex("_studentname")); 
      dbString += "\n"; 
     } 
    } 
    db.close(); 
    return dbString; 
} 
} 

錯誤,顯示了:

05-31 22:32:15.734 14795-14795/? I/art: Late-enabling -Xcheck:jni 
05-31 22:32:15.765 14795-14801/? I/art: Debugger is no longer active 
05-31 22:32:15.786 14795-14795/? W/System: ClassLoader referenced unknown 
path: /data/app/com.example.android.dbms-1/lib/arm 
05-31 22:32:15.922 14795-14795/? W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable 
05-31 22:32:16.051 14795-14810/? D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true 
05-31 22:32:16.114 14795-14810/? I/Adreno-EGL: <qeglDrvAPI_eglInitialize:379>: EGL 1.4 QUALCOMM build: (Ifd751822f5) 
              OpenGL ES Shader Compiler Version: XE031.06.00.05 
              Build Date: 01/26/16 Tue 
              Local Branch: AU12_SBA 
              Remote Branch: 
              Local Patches: 
              Reconstruct Branch: 
05-31 22:32:16.116 14795-14810/? I/OpenGLRenderer: Initialized EGL, version 1.4 
05-31 22:32:28.290 14795-14805/com.example.android.dbms W/art: Suspending all threads took: 5.405ms 
05-31 22:32:28.312 14795-14805/com.example.android.dbms I/art: Background partial concurrent mark sweep GC freed 96(3KB) AllocSpace objects, 90(8MB) LOS objects, 40% free, 8MB/14MB, paused 5.890ms total 32.806ms 
05-31 22:32:32.319 14795-14805/com.example.android.dbms W/art: Suspending all threads took: 5.073ms 
05-31 22:32:34.343 14795-14805/com.example.android.dbms I/art: Background sticky concurrent mark sweep GC freed 84(3KB) AllocSpace objects, 81(10MB) LOS objects, 38% free, 8MB/14MB, paused 5.083ms total 18.483ms 
05-31 22:32:36.545 14795-14801/com.example.android.dbms W/art: Suspending all threads took: 11.236ms 
05-31 22:32:37.036 14795-14801/com.example.android.dbms W/art: Suspending all threads took: 5.119ms 
05-31 22:32:41.672 14795-14805/com.example.android.dbms W/art: Suspending all threads took: 7.867ms 
+0

這將幫助你https://developer.android.com/training/basics/data-storage/databases.html下面的例子 – Pavan

+0

沒有找到任何有用的東西 – Veloxigami

回答

1

確定問題出在你的databaseToString方法有以下取代它,因爲它不會從循環退出

public String databaseToString(){ 
     String dbString = ""; 
     SQLiteDatabase db = this.getWritableDatabase(); 
     String query = "SELECT * FROM "+ TABLE_STUDENTS;//+ " WHERE "+COLUMN_ID+"=1 if you want data for particular id 

     //Cursor point to locate data in table 
     Cursor c = db.rawQuery(query,null); 

     if(c.moveToFirst()){ 
     do{ 
      if(c.getString(c.getColumnIndex("_studentname"))!=null){ 
       dbString += c.getString(c.getColumnIndex("_studentname")); 
       dbString += "\n"; 
      } 
     }while (c.moveToNext()); 
     } 
     db.close(); 
     return dbString; 
    } 

,我也建議您更換您的的DatabaseManager構造

public DatabaseManager(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

所以在活動oncreate替換

manager = new DatabaseManager(this,null,null,1); 

manager = new DatabaseManager(this); 

,你也有問題,在deleteStudent的問題下面是要添加替換爲 「」到值,而不是''

public String databaseToString(){ 
     String dbString = ""; 
     SQLiteDatabase db = this.getWritableDatabase(); 
     String query = "SELECT * FROM "+ TABLE_STUDENTS;//+ " WHERE "+COLUMN_ID+"=1 

     //Cursor point to locate data in table 
     Cursor c = db.rawQuery(query,null); 
     c.moveToFirst(); 

     do{ 
      if(c.getString(c.getColumnIndex("_studentname"))!=null){ 
       dbString += c.getString(c.getColumnIndex("_studentname")); 
       dbString += "\n"; 
      } 
     }while (c.moveToNext()); 

     db.close(); 
     return dbString; 
    } 

https://developer.android.com/training/basics/data-storage/databases.html鏈接提供您插入,刪除,更新和選擇的基本思路

+1

非常感謝你的幫助。還有一件事需要添加,它是檢查表是否爲空集。如果表格返回空集,則應用程序崩潰。我通過使用cursor.getCount()== 0並使用空數據庫通知返回dbString來放置一個約束。 – Veloxigami

+0

或者你可以使用cursor.moveToFirst()添加約束。在回答中編輯 – Pavan