2015-11-10 184 views
0

好的,所以我一直在尋找這個問題,我已經找到了一些我試圖沒有成功的答案。我注意到,如果我註釋掉getWritableDatabase,應用程序不會崩潰,但它不會完成我想要的操作。Android應用程序崩潰使用getWritableDatabase

我也引用這個video幫我創建類

這裏是我提供SQLHelper類:

package com.example.amasio.testapplication; 

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

/** 
* Created by Amasio on 11/9/15. 
*/ 
public class DatabaseController extends SQLiteOpenHelper { 

    public static final String DATABASE_NAME = "Student.db"; 
    public static final String TABLE_NAME = "Student"; 
    public static final String COL_1 = "ID"; 
    public static final String COL_2 = "BANNER ID"; 
    public static final String COL_3 = "FIRST NAME"; 
    public static final String COL_4 = "LAST NAME"; 
    public static final String COL_5 = "GPA"; 
    public static final String COL_6 = "MAJOR"; 

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

    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE " + TABLE_NAME + "(ID INTEGER AUTOINCREMENT, BANNER ID INTEGER PRIMARY KEY, " + 
       "FIRST NAME TEXT, LAST NAME TEXT, GPA REAL, MAJOR TEXT);"); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

     db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME); 
     onCreate(db); 
    } 

    public boolean insertStudent(int bannerId, String firstName, String lastName, double gpa, String major){ 

     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues cv = new ContentValues(); 
     cv.put(COL_2, bannerId); 
     cv.put(COL_3, firstName); 
     cv.put(COL_4, lastName); 
     cv.put(COL_5, gpa); 
     cv.put(COL_6, major); 
     long result = db.insert(TABLE_NAME, null, cv); 
     db.close(); 

     if(result == -1){ 
      return false; 
     } else{ 
      return true; 
     } 

    } 
} 

這裏的活動:

package com.example.amasio.testapplication; 

import android.app.AlertDialog; 
import android.content.DialogInterface; 
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.view.View; 

import android.widget.ArrayAdapter; 
import android.widget.EditText; 
import android.widget.Spinner; 
import android.widget.Toast; 

public class SignupActivity extends AppCompatActivity { 

    DatabaseController studentDb; 
    Student s; 
    EditText bannerIdText; 
    EditText firstNameText; 
    EditText lastNameText; 
    //add email EditText 
    EditText gpaText; 
    Spinner majorSpinner; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_signup); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     toolbar.setTitle("Sign Up"); 
     setSupportActionBar(toolbar); 

     bannerIdText = (EditText) findViewById(R.id.bannerId); 
     firstNameText = (EditText) findViewById(R.id.firstName); 
     lastNameText = (EditText) findViewById(R.id.lastName); 
     gpaText = (EditText) findViewById(R.id.gpa); 
     majorSpinner = (Spinner) findViewById(R.id.major); 

     // Create an ArrayAdapter using the string array and a default spinner layout 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
       R.array.college_majors, android.R.layout.simple_spinner_item); 

     // Specify the layout to use when the list of choices appears 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

     // Apply the adapter to the spinner 
     majorSpinner.setAdapter(adapter); 
    } 

    public void onRegisterClicked(View v){ 

     int banner = Integer.parseInt(bannerIdText.getText().toString()); 
     double gpa = Double.parseDouble(gpaText.getText().toString()); 
     String majorValue = majorSpinner.getSelectedItem().toString(); 

     studentDb = new DatabaseController(this); 
     boolean inserted = studentDb.insertStudent(banner, firstNameText.getText().toString(), 
       lastNameText.getText().toString(), gpa, majorValue); 

     if(inserted){ 
      Toast.makeText(SignupActivity.this, "Data Inserted", Toast.LENGTH_LONG).show(); 
     }else { 
      Toast.makeText(SignupActivity.this, "Data not Inserted", Toast.LENGTH_LONG).show(); 
     } 
    } 

} 

下面是日誌:

11-10 00:24:56.781 21455-21455/? E/SQLiteLog: (1) near "AUTOINCREMENT": syntax error 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime: FATAL EXCEPTION: main 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime: Process: com.example.amasio.testapplication, PID: 21455 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime: java.lang.IllegalStateException: Could not execute method of the activity 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at android.view.View$1.onClick(View.java:4298) 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at android.view.View.performClick(View.java:5254) 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at android.view.View$PerformClick.run(View.java:21179) 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at android.os.Handler.handleCallback(Handler.java:739) 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:95) 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:145) 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:6837) 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method) 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:372) 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime: Caused by: java.lang.reflect.InvocationTargetException 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method) 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:372) 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at android.view.View$1.onClick(View.java:4293) 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at android.view.View.performClick(View.java:5254)  
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at android.view.View$PerformClick.run(View.java:21179)  
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at android.os.Handler.handleCallback(Handler.java:739)  
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:95)  
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:145)  
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:6837)  
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method)  
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:372)  
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)  
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)  
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime: Caused by: android.database.sqlite.SQLiteException: near "AUTOINCREMENT": syntax error (code 1): , while compiling: CREATE TABLE Student(ID INTEGER AUTOINCREMENT, BANNER ID INTEGER PRIMARY KEY, FIRST NAME TEXT, LAST NAME TEXT, GPA REAL, MAJOR TEXT); 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime: ################################################################# 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime: Error Code : 1 (SQLITE_ERROR) 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime: Caused By : SQL(query) error or missing database. 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime: (near "AUTOINCREMENT": syntax error (code 1): , while compiling: CREATE TABLE Student(ID INTEGER AUTOINCREMENT, BANNER ID INTEGER PRIMARY KEY, FIRST NAME TEXT, LAST NAME TEXT, GPA REAL, MAJOR TEXT);) 
11-10 00:24:56.791 21455-21455/? E/AndroidRuntime: ################################################################# 

編輯:我做了幾個類的更改。

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL("CREATE TABLE " + TABLE_NAME + "(ID AUTOINCREMENT, BANNER_ID INTEGER PRIMARY KEY, " + 
      "FIRST_NAME TEXT, LAST_NAME TEXT, GPA DOUBLE, MAJOR TEXT);"); 

} 

這是在活動:

public void onRegisterClicked(View v){ 

     int banner = Integer.parseInt(bannerIdText.getText().toString()); 
     double gpa = Double.parseDouble(gpaText.getText().toString()); 
     String majorValue = majorSpinner.getSelectedItem().toString(); 

     studentDb = new DatabaseController(this); 
     boolean inserted = studentDb.insertStudent(banner, firstNameText.getText().toString(), 
       lastNameText.getText().toString(), gpa, majorValue); 

     if(inserted){ 
      Toast.makeText(SignupActivity.this, "Data Inserted", Toast.LENGTH_LONG).show(); 
     }else { 
      Toast.makeText(SignupActivity.this, "Data not Inserted", Toast.LENGTH_LONG).show(); 
     } 
    } 

登錄:

11-10 12:06:04.631 31358-31393/? E/MTPJNIInterface: noti = 29 
11-10 12:06:05.291 29884-29884/? E/SQLiteLog: (1) near "NAME": syntax error 
11-10 12:06:05.301 29884-29884/? E/SQLiteDatabase: Error inserting FIRST NAME=mike LAST NAME=page BANNER ID=950266678 MAJOR=Computer Science GPA=3.88 
11-10 12:06:05.301 29884-29884/? E/SQLiteDatabase: android.database.sqlite.SQLiteException: near "NAME": syntax error (code 1): , while compiling: INSERT INTO Student(FIRST NAME,LAST NAME,BANNER ID,MAJOR,GPA) VALUES (?,?,?,?,?) 
11-10 12:06:05.301 29884-29884/? E/SQLiteDatabase: ################################################################# 
11-10 12:06:05.301 29884-29884/? E/SQLiteDatabase: Error Code : 1 (SQLITE_ERROR) 
11-10 12:06:05.301 29884-29884/? E/SQLiteDatabase: Caused By : SQL(query) error or missing database. 
11-10 12:06:05.301 29884-29884/? E/SQLiteDatabase: (near "NAME": syntax error (code 1): , while compiling: INSERT INTO Student(FIRST NAME,LAST NAME,BANNER ID,MAJOR,GPA) VALUES (?,?,?,?,?)) 
11-10 12:06:05.301 29884-29884/? E/SQLiteDatabase: ################################################################# 
+0

閱讀[文件](HTTP:// WWW。 sqlite.org/autoinc.html)。 –

+0

你好mapage2我的答案是否適合你? – Amsheer

+0

@Amsheer我會盡快嘗試。我真的很感激你的意見。我希望我能解決這個問題。 – mapage2

回答

0

更改此

db.execSQL("CREATE TABLE " + TABLE_NAME + "(ID INTEGER AUTOINCREMENT, BANNER ID INTEGER PRIMARY KEY, " + 
       "FIRST NAME TEXT, LAST NAME TEXT, GPA REAL, MAJOR TEXT);"); 

db.execSQL("CREATE TABLE " + TABLE_NAME + "(ID INTEGER AUTOINCREMENT, BANNER_ID INTEGER PRIMARY KEY, " + 
       "FIRST_NAME TEXT, LAST_NAME TEXT, GPA_REAL, MAJOR TEXT);"); 

注意:從列名稱中刪除空格。這是一個問題。如果沒有解決,讓我知道。

+0

負面投票的原因是什麼? – Amsheer

+0

我不知道爲什麼發生。我嘗試+1,但我的應用說我需要更多的聲譽。接下來我知道它說-1。抱歉! – mapage2

+0

只是現在修復它的工作! – mapage2

-1

我讀過你的logcat,我發現附近

「AUTOINCREMENT」 語法錯誤:語法錯誤(代碼1):在編譯:CREATE TABLE學生(ID INTEGER AUTOINCREMENT,BANNER ID INTEGER PRIMARY KEY, FIRST NAME TEXT,姓氏TEXT,GPA REAL,主要TEXT);)

有你的屬性名稱空間中刪除這些或添加_代替空格

+0

忽略之前的評論只是修復它!謝謝 – mapage2