java - SQLite数据库升级后崩溃

标签 java android eclipse android-sqlite

我从版本 1 向数据库添加了 3 个新列,因此我将其更改为版本 2,但现在当我使用使用数据库的 Activity 时,我的应用程序崩溃并在 logcat 中显示这一点。

04-02 18:41:09.013: E/AndroidRuntime(19171): FATAL EXCEPTION: main 04-02 18:41:09.013: E/AndroidRuntime(19171): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.fullfrontalgames.numberfighter/com.fullfrontalgames.numberfighter.AccountSettings}: android.database.sqlite.SQLiteException: near "CREATE": syntax error (code 1): , while compiling: create table NFDB( ID integer primary key autoincrement,USERNAME text CREATE UNIQUE INDEX idx_keytype ON tableName (USERNAME);USERNAME text,PASSWORD text,EMAIL text,NUMBERINPUT text,SCORE text,FRIENDS text);

04-02 18:41:09.013: E/AndroidRuntime(19171): Caused by: android.database.sqlite.SQLiteException: near "CREATE": syntax error (code 1): , while compiling: create table NFDB( ID integer primary key autoincrement,USERNAME text 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;

            }


        }

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




  }

最佳答案

您的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);

关于java - SQLite数据库升级后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15775937/

相关文章:

java - addMany(E... element) 方法参数中的 E... 是什么意思?

android - 使用 GSON 从 Web 服务检索数据时遇到问题

eclipse - 安装自签名 p12 证书后在 firefox 上获取 ssl_error_bad_cert_alert

java - 如何在 eclipse juno 中使用 post 请求调试动态 web 项目

Java 回文检查器

java - 如何在 netbeans 中单步执行/调试导入的 java 代码

android - 将应用程序缩放到更大的屏幕

java - 为什么 handleMessage 在 ui 线程中运行而我使用后台线程循环器创建处理程序?

java - 如何修复 e4 应用程序中的 "No Application ID has been Found"错误?

java - 如何使用 JDBC 在 ListView 或 TableView 中显示来自 SQL Server 的数据