2013-04-02 112 views
0

我從版本1向我的數據庫添加了3個新列,因此我將其更改爲版本2,但現在當我使用使用我的數據庫的活動時,我的應用崩潰並在logcat中顯示此列。升級後SQLitedatabase崩潰

04-02 18:41:09.013:E/AndroidRuntime(19171):致命異常:主 04-02 18:41:09.013:E/AndroidRuntime(19171): 了java.lang.RuntimeException:無法啓動活動 ComponentInfo {com.fullfrontalgames.numberfighter/com.fullfrontalgames.numberfighter.AccountSettings}: android.database.sqlite.SQLiteException:接近「CREATE」:語法錯誤 (代碼1):,編譯時:create table NFDB(ID整數主鍵 自動增量,USERNAME文本CREATE UNIQUE INDEX idx_keytype ON tableName(USERNAME); USERNAME text,PASSWORD text,EMAIL text,NUMBERINPUT text,SCORE text,FRIENDS文本);

04-02 18:41:09.013:E/AndroidRuntime(19171): android.database.sqlite.SQLiteException:致近 「創建」:語法錯誤 (碼1):在編譯:創建表NFDB(ID整數主鍵 自動增量,USERNAME文本CREATE UNIQUE INDEX idx_keytype ON tableName(USERNAME); USERNAME text,PASSWORD text,EMAIL text,NUMBERINPUT text,SCORE text,FRIENDS text);

我看不到任何地方的語法錯誤,我有我的DBHelper幫助類放棄我的舊錶,並使新表。

這裏是我的我將對DBAdapter和DBHelper類

package com.fullfrontalgames.numberfighter; 

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


public class DBAdapter 
{ 
     static final String DATABASE_NAME = "NFDB.db"; 
     static final int DATABASE_VERSION = 2; 
     public static final int NAME_COLUMN = 1; 
     // TODO: Create public field for each column in your table. 
     // SQL Statement to create a new database. 
     static final String DATABASE_CREATE = "create table "+"NFDB"+ 
            "(" +"ID"+" integer primary key autoincrement,"+ "USERNAME text CREATE UNIQUE INDEX idx_keytype ON tableName (USERNAME);" + 
              "PASSWORD text,EMAIL text,NUMBERINPUT text,SCORE text,FRIENDS text); "; 
     // Variable to hold the database instance 
     public SQLiteDatabase db; 
     // Context of the application using the database. 
     private final Context context; 
     // Database open/upgrade helper 
     private DataBaseHelper DBHelper; 
     public DBAdapter(Context _context) 
     { 
      context = _context; 
      DBHelper = new DataBaseHelper(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 
     public DBAdapter open() throws SQLException 
     { 
      db = DBHelper.getWritableDatabase(); 
      return this; 
     } 
     public void close() 
     { 
      db.close(); 
     } 

     public SQLiteDatabase getDatabaseInstance() 
     { 
      return db; 
     } 

     public void insertEntry(String userName,String password,String email) 
     { 
      ContentValues newValues = new ContentValues(); 
      // Assign values for each row. 
      newValues.put("USERNAME", userName); 
      newValues.put("PASSWORD",password); 
      newValues.put("EMAIL", email); 
      // Insert the row into your table 
      db.insert("NFDB", null, newValues); 
      ///Toast.makeText(context, "Reminder Is Successfully Saved", Toast.LENGTH_LONG).show(); 
     } 
     public int deleteEntry(String userName) 
     { 
      //String id=String.valueOf(ID); 
      String where="USERNAME=?"; 
      int numberOFEntriesDeleted= db.delete("NFDB", where, new String[]{userName}) ; 
      // Toast.makeText(context, "Number fo Entry Deleted Successfully : "+numberOFEntriesDeleted, Toast.LENGTH_LONG).show(); 
      return numberOFEntriesDeleted; 
     }  
     public String getSinlgeEntry(String userName) 
     { 
      Cursor cursor=db.query("NFDB", null, " USERNAME=?", new String[]{userName}, null, null, null); 
      if(cursor.getCount()<1) // UserName Not Exist 
      { 
       cursor.close(); 
       return "NOT EXIST"; 
      } 
      cursor.moveToFirst(); 
      String password= cursor.getString(cursor.getColumnIndex("PASSWORD")); 
      cursor.close(); 
      return password; 

     } 
     public void updateEntry(String userName,String password) 
     { 
      // Define the updated row content. 
      ContentValues updatedValues = new ContentValues(); 
      // Assign values for each row. 
      updatedValues.put("USERNAME", userName); 
      updatedValues.put("PASSWORD",password); 


      String where="USERNAME = ?"; 
      db.update("NFDB",updatedValues, where, new String[]{userName});    
     } 
     public String getData() { 
      String[] columns = new String[] { "ID", "USERNAME"}; 
      Cursor c = db.query("NFDB", columns, null, null, null, null, null, null); 
      String result =""; 
      int iRow = c.getColumnIndex("ID"); 
      int iName = c.getColumnIndex("USERNAME"); 

      for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { 
       result = result + c.getString(iRow) + " " + c.getString(iName) + "/n"; 
      } 

      return result; 
     } 

     public String getUsername(String searchName) { 
      Cursor c = db.query("NFDB", 
           new String[] { "USERNAME" }, 
           "USERNAME = ?", 
           new String[] { searchName }, 
           null, null, null); 
      if (c.moveToNext()) 
       return c.getString(0); 
      else 
       return ""; 
     } 
     public void InsertScore(String Username,String Score) 
     { 
      ContentValues ScoreValues = new ContentValues(); 
      ScoreValues.put("USERNAME", Username); 
      ScoreValues.put("SCORE", Score); 
      db.insert("NFDB", null, ScoreValues); 

     } 
     public String GetGameScore(String Username,String Score) 
     { 
      Cursor cursor = db.query("NFDB", null, "USERNAME",new String[]{Username,Score}, null, null, null); 
      cursor.moveToFirst(); 
      cursor.close(); 
      return Username; 
     } 
     public String GetAllScore() 
     { 
      String[] columns = new String[] {"ID","USERNAME","SCORE"}; 
      Cursor cursor = db.query("NFDB", columns, null, null, null, null, null); 
      String result=""; 
      int iRow = cursor.getColumnIndex("ID"); 
      int iUsername = cursor.getColumnIndex("USERNAME"); 
      int iScore = cursor.getColumnIndex("SCORE"); 

      for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { 
       result = result + cursor.getString(iRow) + " " + cursor.getString(iUsername) + " " + cursor.getString(iScore) + "/n"; 
      } 
      return result; 
      } 

     public void InsertNumber(String Username,String Number) 
     { 
      ContentValues NumberValues = new ContentValues(); 
      NumberValues.put("USERNAME", Username); 
      NumberValues.put("NUMBERINPUT", Number); 
      db.insert("NFDB", null, NumberValues); 
      } 

     public String GetNumber(String Username,String Number) 
     { 
      Cursor cursor = db.query("NFDB", null, "USERNAME", new String[]{Username,Number}, null, null, null, null); 
      cursor.moveToFirst(); 
      cursor.close(); 
      return Username; 
     } 

     public String GetAllNumbers() 
     { 
      String[] columns = new String[] {"ID","USERNAME","NUMBERINPUT"}; 
      Cursor cursor = db.query("NFDB", columns, null, null, null, null, null, null); 
      String result=""; 
      int iRow = cursor.getColumnIndex("ID"); 
      int iName = cursor.getColumnIndex("USERNAME"); 
      int iNumber = cursor.getColumnIndex("NUMBERINPUT"); 

      for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { 
       result = result + cursor.getString(iRow) + " " + cursor.getString(iName) + " " + cursor.getString(iNumber) + "/n"; 
      } 
      return result; 

      } 
     public void InsertFriends (String Username,String Friends) 
     { 
      ContentValues FriendValues = new ContentValues(); 
      FriendValues.put("USERNAME", Username); 
      FriendValues.put("FRIENDS", Friends); 
      db.insert("NFDB", null, FriendValues); 
     } 

     public int DeleteFriends(String Username,String Friends) 
     { 
      String where = "USERNAME=?,FRIENDS=?"; 
      int numberOfEntriesDeleted = db.delete("NFDB", where, new String[]{Username,Friends}); 
      return numberOfEntriesDeleted; 
     } 

     public String GetFriend(String Username,String Friend) 
     { 
      Cursor cursor = db.query("NFDB", null, "USERNAME", new String[]{Username,Friend}, null, null, null, null); 
      cursor.moveToFirst(); 
      cursor.close(); 
      return Username; 
     } 


     public String GetAllFriends() 
     { 
      String[] columns = new String[] {"ID","USERNAME","FRIENDS"}; 
      Cursor cursor = db.query("NFDB", columns, null, null, null, null, null, null); 
      String result=""; 
      int iRow = cursor.getColumnIndex("ID"); 
      int iName = cursor.getColumnIndex("USERNAME"); 
      int iFriends = cursor.getColumnIndex("FRIENDS"); 

      for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { 
       result = result + cursor.getString(iRow) + " " + cursor.getString(iName) + " " + cursor.getString(iFriends) + "/n"; 
      } 
      return result; 

      } 


     } 

包com.fullfrontalgames.numberfighter的代碼;

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class DataBaseHelper extends SQLiteOpenHelper 
{ 
    public DataBaseHelper(Context context, String name,CursorFactory factory, int version) 
    { 
       super(context, name, factory, version); 
    } 

     // TODO Auto-generated constructor stub 

    // Called when no database exists in disk and the helper class needs 
    // to create a new one. 
    @Override 
    public void onCreate(SQLiteDatabase _db) 
    { 
      _db.execSQL(DBAdapter.DATABASE_CREATE); 

    } 
    // Called when there is a database version mismatch meaning that the version 
    // of the database on disk needs to be upgraded to the current version. 
    @Override 
    public void onUpgrade(SQLiteDatabase _db, int _oldVersion, int _newVersion) 
    { 
      // Log the version upgrade. 
      Log.w("TaskDBAdapter", "Upgrading from version " +_oldVersion + " to " +_newVersion + ", which will destroy all old data"); 

      // Upgrade the existing database to conform to the new version. Multiple 
      // previous versions can be handled by comparing _oldVersion and _newVersion 
      // values. 
      // The simplest case is to drop the old table and create a new one. 
      _db.execSQL("DROP TABLE IF EXISTS " + "NFDB"); 
      // Create a new one. 
      onCreate(_db); 
    } 




    } 
+1

'ON tableName(USERNAME);「'你認爲''''必須是','。 – Smit

回答

1

DML說法是不正確。在CREATE TABLE聲明中不能使用索引創建。它必須有自己的說法。

你必須糾正這樣的:

DATABASE_CREATE = "create table NFDB(" 
        + "ID integer primary key autoincrement, " 
        + "USERNAME text, PASSWORD text, " 
        + "EMAIL text, NUMBERINPUT text, " 
        + "SCORE text, FRIENDS text)"; 

和第二聲明:

CREATE_INDEX_KEYTYPE = "CREATE UNIQUE INDEX idx_keytype ON tableName(USERNAME)"; 

最後,在你的SQLiteOpenHelper子類實現執行以下操作:

_db.execSQL(DBAdapter.DATABASE_CREATE); 
_db.execSQL(DBAdapter.CREATE_INDEX_KEYTYPE); 
+0

非常感謝你,你是一個救星! – Cranosaur

+0

@Cranosaur歡迎您:) – Sajmon

相關問題