Java 为什么我的android应用程序强制关闭?

Java 为什么我的android应用程序强制关闭?,java,android,eclipse,sqlite,Java,Android,Eclipse,Sqlite,我有一个android应用程序,它将使用SQLite数据库。但当它到达select语句时,它将强制关闭。我有一个用于执行此操作的类文件: package com.thesis.menubook; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import andr

我有一个android应用程序,它将使用
SQLite
数据库。但当它到达select语句时,它将强制关闭。我有一个用于执行此操作的类文件:

package com.thesis.menubook;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;

public class DBConnect {

        int id = 0;
        public static final String KEY_ROWID = "_id";
        public static final String KEY_IP = "saved_ip_address";
        private static final String TAG = "DBConnect";

        private static final String DATABASE_NAME = "MenuBook";
        private static final String DATABASE_TABLE_1 = "ipaddress";
       //private static final String DATABASE_TABLE_2 = "menudb";
       //private static final String DATABASE_TABLE_3 = "recipelist";
        private static final int DATABASE_VERSION = 1;

        private static final String DATABASE_CREATE_TABLE_1 =
            "CREATE TABLE ipaddress (_id integer primary key autoincrement, " +
                                 "saved_ip_address text not null " +
                                 "); ";
        private static final String DATABASE_CREATE_TABLE_2 =
            "CREATE TABLE menudb (menu_ID varchar primary key not null, " +
                                 "menu_name longtext, " +
                                 "menu_price double null default, " +
                                 "menu_description longtext, " +
                                 "menu_category text, " +
                                 "menu_status text " +
                                 "); ";
        private static final String DATABASE_CREATE_TABLE_3 =
            "CREATE TABLE recipelist (recipe_ID integer primary key not null autoincrement, " +
                                 "menu_ID varchar null default, " +
                                 "stock_ID varchar null default, " +
                                 "recipe_quantity double null defualt " +
                                 ");" ;

        private final Context context;

        private static DatabaseHelper DBHelper;
        private static SQLiteDatabase db;

        public DBConnect(Context ctx)
        {
            this.context = ctx;
            DBHelper = new DatabaseHelper(context);
        }

        public static class DatabaseHelper extends SQLiteOpenHelper
        {
            DatabaseHelper(Context context)
            {
                super(context, DATABASE_NAME, null, DATABASE_VERSION);
            }

            @Override
            public void onCreate(SQLiteDatabase db)
            {
                db.execSQL(DATABASE_CREATE_TABLE_1);
                db.execSQL(DATABASE_CREATE_TABLE_2);
                db.execSQL(DATABASE_CREATE_TABLE_3);
            }

            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion,
                                  int newVersion)
            {
                Log.w(TAG, "Upgrading database from version " + oldVersion
                      + " to "
                      + newVersion + ", which will destroy all old data");
                db.execSQL("DROP TABLE IF EXISTS ipaddress");
                db.execSQL("DROP TABLE IF EXISTS menudb");
                db.execSQL("DROP TABLE IF EXISTS recipelist");
                onCreate(db);
            }

        }

        //---opens the database---
        public DBConnect open() throws SQLException
        {
            db = DBHelper.getWritableDatabase();
            return this;
        }

        //---closes the database---
        public void close()
        {
            DBHelper.close();
        }

        //---insert a title into the database---
        public long insertIPAddress(String ipaddress)
        {
            ContentValues initialValues = new ContentValues();
            initialValues.put(KEY_IP, ipaddress);
            return db.insert(DATABASE_TABLE_1, null, initialValues);
        }

        public String getIP()
        {
            String retrievedIP;

            String query = "SELECT saved_ip_address FROM ipaddress WHERE _id = (SELECT MAX(_id) FROM ipaddress)";
            Cursor cursor = db.rawQuery(query, null);
            retrievedIP= cursor.getString(cursor.getColumnIndex("saved_ip_address"));
            cursor.close();
            return retrievedIP;
        }

        public List<ColumnValue[]> select(final String query)
        {
            List<ColumnValue[]> result = null;
            Cursor cursor = db.rawQuery(query, null);

            if (cursor.moveToFirst())
            {
                result = new ArrayList<ColumnValue[]>();

                do
                {
                    int columns = cursor.getColumnCount();
                    ColumnValue[] cvarray = new ColumnValue[columns];

                    for (int i=0; i<columns; i++)
                    {
                        String key = cursor.getColumnName(i);
                        String value = cursor.getString(i);
                        ColumnValue cv = new ColumnValue(key, value);
                        cvarray[i] = cv;
                    }

                    result.add(cvarray);
                }
                while (cursor.moveToNext());
            }

            cursor.close();

            return result;
        }

        public class ColumnValue
        {
            public String column, value;

            public ColumnValue(String c, String v)
            {
                column = c; value = v;
            }
        }


}
package.com.thesis.menubook;
导入android.content.ContentValues;
导入android.content.Context;
导入android.database.Cursor;
导入android.database.SQLException;
导入android.database.sqlite.SQLiteDatabase;
导入android.database.sqlite.SQLiteOpenHelper;
导入android.util.Log;
导入java.util.ArrayList;
导入java.util.List;
公共类数据库连接{
int id=0;
公共静态最终字符串键_ROWID=“_id”;
公共静态最终字符串键\u IP=“保存的\u IP\u地址”;
私有静态最终字符串TAG=“DBConnect”;
私有静态最终字符串数据库\u NAME=“MenuBook”;
私有静态最终字符串数据库\u TABLE\u 1=“ipaddress”;
//私有静态最终字符串数据库\u TABLE_2=“menudb”;
//私有静态最终字符串数据库\u TABLE\u 3=“recipelist”;
私有静态最终int数据库_VERSION=1;
私有静态最终字符串数据库\u创建\u表\u 1=
“创建表ipaddress(\u id integer主键自动递增,”+
“保存的ip地址文本不为空”+
"); ";
私有静态最终字符串数据库\u创建\u表\u 2=
“创建表menudb(菜单ID varchar主键不为null,”+
“菜单名称长文本,”+
“菜单\价格双空默认值,”+
“菜单描述长文本,”+
“菜单\u类别文本,”+
“菜单\状态文本”+
"); ";
私有静态最终字符串数据库\u创建\u表\u 3=
“创建表recipelist(recipe\u ID整数主键非空自动递增,”+
“菜单\u ID varchar null默认值,”+
股票ID varchar null默认值+
“配方\数量双空解除”+
");" ;
私人最终语境;
私有静态数据库助手DBHelper;
私有静态数据库;
公共数据库连接(上下文ctx)
{
this.context=ctx;
DBHelper=新数据库助手(上下文);
}
公共静态类DatabaseHelper扩展了SQLiteOpenHelper
{
DatabaseHelper(上下文)
{
super(上下文、数据库名称、null、数据库版本);
}
@凌驾
public void onCreate(SQLiteDatabase db)
{
execSQL(数据库\创建\表\ 1);
execSQL(数据库\创建\表\ 2);
execSQL(数据库\创建\表\ 3);
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int oldVersion,
int(新版本)
{
Log.w(标记“从版本升级数据库”+旧版本
+“到”
+新版本+”,将销毁所有旧数据);
db.execSQL(“如果存在ipaddress,则删除表”);
execSQL(“如果存在,则删除表menudb”);
db.execSQL(“如果存在recipelist,则删除表”);
onCreate(db);
}
}
//---打开数据库---
public DBConnect open()引发SQLException
{
db=DBHelper.getWritableDatabase();
归还这个;
}
//---关闭数据库---
公众假期结束()
{
DBHelper.close();
}
//---将标题插入数据库---
公共长插入地址(字符串ipaddress)
{
ContentValues initialValues=新的ContentValues();
initialValues.put(KEY_IP,ipaddress);
返回db.insert(数据库表1,null,初始值);
}
公共字符串getIP()
{
字符串检索IP;
String query=“从ipaddress中选择已保存的\u ip\u地址,其中\u id=(从ipaddress中选择MAX(\u id)”;
Cursor Cursor=db.rawQuery(查询,空);
retrievedIP=cursor.getString(cursor.getColumnIndex(“保存的ip地址”);
cursor.close();
返回检索IP;
}
公共列表选择(最终字符串查询)
{
列表结果=空;
Cursor Cursor=db.rawQuery(查询,空);
if(cursor.moveToFirst())
{
结果=新的ArrayList();
做
{
int columns=cursor.getColumnCount();
ColumnValue[]cvarray=新ColumnValue[列];

对于(int i=0;i>>>AndroidRuntime START com.android.internal.os.RuntimeInit您有两个“create”语句。其中一个包含

_id integer primary key autoincrement
根据文件,这是正确的。另一个

recipe_ID integer primary key not null autoincrement
我怀疑额外的“NOTNULL”就是问题所在。因为它是主键,所以本质上应该是“NOTNULL”,所以这可能是您的语法错误


您还可以使用调试器找出导致问题的语句执行。在每个sql语句执行周围设置一个try/catch块可能也是一个好主意。

您有两个“create”语句。其中一个包含

_id integer primary key autoincrement
根据文件,这是正确的。另一个

recipe_ID integer primary key not null autoincrement
我怀疑额外的“NOTNULL”就是问题所在。因为它是主键,所以本质上应该是“NOTNULL”,所以这可能是您的语法错误

您还可以使用调试器找出是哪个语句执行导致了问题