2017-05-31 2 views
0

Dies ist meine MainActivity.java-Datei. Ich versuche, eine einfache Anwendung zu erstellen, um Studentenname einzugeben, und dann speichert es es in einer Datenbank, die die zwei anderen Klassen DatabaseManager.java und Students.java verwendet. Das Problem ist, dass, wenn ich versuche, die App zu starten und auf die Schaltfläche "Hinzufügen" zu klicken, die App einfriert und der Fehler unten in AppLogCat angezeigt wird.SQLite-Datenbank Grafikfehler

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; 
} 
} 

Fehler, der zeigt nach oben:

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

das wird dir helfen https://developer.android.com/training/basics/data-storage/databases.html folge dem Beispiel – Pavan

+0

habe nichts gefunden was hier hilfreich ist – Veloxigami

Antwort

1

ok Problem ist in Ihrem databaseToString Methode ersetzen mit folgenden, weil sie von der Schleife nicht Ausfahrt

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; 
    } 

und ich empfehle Ihnen auch Ihre DatabaseManager-Konstruktor zu

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

so in Aktivität oncreate ersetzen

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

mit

manager = new DatabaseManager(this); 

und Sie auch Probleme in deleteStudent haben ersetzen mit unter dem Problem wurde Sie hinzufügen "" statt zu schätzen ''

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; 
    } 

Diese https://developer.android.com/training/basics/data-storage/databases.html Link bieten Ihnen die Grundidee des Einfügens, Löschen, Aktualisieren und Auswählen

+1

Vielen Dank für die Hilfe. Es gab noch eine weitere Sache, die hinzugefügt werden musste, und es wurde geprüft, ob die Tabelle leer ist oder nicht. App stürzt ab, wenn die Tabelle einen leeren Satz zurückgegeben hat. Ich habe eine Bedingung gesetzt, indem ich cursor.getCount() == 0 verwende und dbString mit der Benachrichtigung einer leeren Datenbank zurücksende. – Veloxigami

+0

oder Sie können constraint mit cursor.moveToFirst(); wie in Antwort bearbeitet – Pavan