Java 为什么我的android应用程序强制关闭?
我有一个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
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”,所以这可能是您的语法错误
您还可以使用调试器找出是哪个语句执行导致了问题