java - Android 应用程序 SQLite 数据库创建崩溃

标签 java android eclipse debugging sqliteopenhelper

我正在为自己开发一个简单的应用程序,将信息发布到数据库。我对此非常陌生,并尝试按照一些教程和其他花絮来组装它。

有一个主屏幕可以进入第二个屏幕,其中有一个按钮(添加项目)。单击时,这应该会构建/更新数据库。当我在任何事情发生之前进入第二个屏幕时,我会崩溃。我尝试设置断点来调试,但我什至无法到达任何地方。它不会在我的断点处暂停(或似乎没有),所以我看不到发生了什么

任何人都可以指出调试/修复此问题的正确方向吗?

这是我的第二个屏幕代码 - java

public class AddItem extends Activity {

    private final String TAG = "Main Activity";
    View view;
    SQLiteDatabase db; 
    DbPrice dbprice ; 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_item); 
        Log.i(TAG, "OnCreate"); 
        dbprice = new DbPrice(this);
        db = dbprice.getWritableDatabase(); 

        Button addButton = (Button) findViewById(R.id.addNew);
        addButton.setOnClickListener(new OnClickListener() {

            public void onClick(View arg0) {
                String subcat,item,store,extra;
                Integer day,month,year,price,quantity,weight,volume;
                Boolean sale;

                DatePicker datePicker1 = (DatePicker) findViewById(R.id.datePicker1);
                AutoCompleteTextView autoCompleteSubCat = (AutoCompleteTextView) findViewById(R.id.autoCompleteSubCat);
                EditText editItem = (EditText) findViewById(R.id.editItem);
                EditText editPrice = (EditText) findViewById(R.id.editPrice);
                EditText editQuantity = (EditText) findViewById(R.id.editQuantity); 
                EditText editWeight = (EditText) findViewById(R.id.editWeight);
                EditText editVolume = (EditText) findViewById(R.id.editVolume);
                CheckBox checkSale = (CheckBox) findViewById(R.id.checkSale);
                AutoCompleteTextView autoCompleteStore = (AutoCompleteTextView) findViewById(R.id.autoCompleteStore);
                EditText editExtra = (EditText) findViewById(R.id.editExtra);

                day = datePicker1.getDayOfMonth();
                month = datePicker1.getMonth();
                year = datePicker1.getYear();
                subcat = autoCompleteSubCat.getText().toString();
                item = editItem.getText().toString();
                extra = editExtra.getText().toString();
                price = Integer.parseInt(editPrice.getText().toString());
                quantity = Integer.parseInt(editQuantity.getText().toString());
                weight = Integer.parseInt(editWeight.getText().toString());
                volume = Integer.parseInt(editVolume.getText().toString());
                // sale = checkSale.isChecked(); 
                store = autoCompleteStore.getText().toString();


                ContentValues cv = new ContentValues();
                cv.put(DbPrice.SUBCAT, subcat);
                cv.put(DbPrice.ITEM, item);
                cv.put(DbPrice.EXTRA, extra);
                cv.put(DbPrice.PRICE, price);
                cv.put(DbPrice.QUANTITY, quantity);
                cv.put(DbPrice.WEIGHT, weight);
                cv.put(DbPrice.VOLUME, volume);
                cv.put(DbPrice.SALE, sale);
                cv.put(DbPrice.STORE, store);

                db.insert(DbPrice.TABLE_NAME, null, cv);
            }
        });
    }


    @Override 
    public void onStart() {
        super.onStart();
        Log.i(TAG, "OnStart");
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.i(TAG, "OnResume");
    }

    public void OnPause() {
        super.onPause();
        Log.i(TAG,"OnPause");
    }

    public void OnStop() {
        super.onStart();
        Log.i(TAG, "OnStop"); 
    }

    public void OnDestroy() {
        super.onDestroy();
        Log.i(TAG, "OnDestroy");
    }

    public void addNewItem (View v) {
        Log.i(TAG, "Starting New Activity"); 
        Intent intent = new Intent (this, AllItems.class);
        startActivity(intent);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.add_item, menu);
        return true;
    }
}

数据库类java如下。我不知道您是否也需要 xml,但我包含了目录。

public class DbPrice extends SQLiteOpenHelper {

    public static final String DATABASE_NAME = "data";
    public static final String TABLE_NAME = "price_table";
    public static final String C_ID = "_id";
    public static final String DAY = "day";  
    public static final String MONTH = "month";  
    public static final String YEAR = "day";  
    public static final String SUBCAT = "subcategory";
    public static final String ITEM = "item";
    public static final String PRICE = "price";  
    public static final String QUANTITY = "quantity"; 
    public static final String WEIGHT = "weight"; 
    public static final String VOLUME = "volume"; 
    public static final String SALE = "sale";
    public static final String STORE = "store";
    public static final String EXTRA = "extra";
    public static final int VERSION = 1; 

    private final String createDb = "create table if not exists " + TABLE_NAME+ " ( "
        + C_ID + " integer primary key autoincrement, "
        + DAY + " text, "
        + MONTH + " text, "
        + YEAR + " text, "
        + SUBCAT + " text, "
        + ITEM + " text, "
        + PRICE + " text, "
        + QUANTITY + " text, "
        + WEIGHT + " text, "
        + VOLUME + " text, "
        + SALE + " text, "
        + STORE + " text, "
        + EXTRA + " text) ";

    public DbPrice(Context context) {
        super(context, DATABASE_NAME, null, VERSION);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(createDb); 
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {
        db.execSQL("drop table " + TABLE_NAME);

    }

}

目录如下

12-29 01:27:20.834: I/Main Activity(1362): OnCreate
12-29 01:27:21.044: E/SQLiteLog(1362): (1) duplicate column name: day
12-29 01:27:21.054: D/AndroidRuntime(1362): Shutting down VM
12-29 01:27:21.064: W/dalvikvm(1362): threadid=1: thread exiting with uncaught exception (group=0xb4b11b90)
12-29 01:27:21.194: E/AndroidRuntime(1362): FATAL EXCEPTION: main
12-29 01:27:21.194: E/AndroidRuntime(1362): Process: com.unsuccessfulstudent.grocerypricehistory, PID: 1362
12-29 01:27:21.194: E/AndroidRuntime(1362): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.unsuccessfulstudent.grocerypricehistory/com.unsuccessfulstudent.grocerypricehistory.AddItem}: android.database.sqlite.SQLiteException: duplicate column name: day (code 1): , while compiling: create table if not exists price_table ( _id integer primary key autoincrement, day text, month text, day text, subcategory text, item text, price text, quantity text, weight text, volume text, sale text, store text, extra text)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at android.app.ActivityThread.access$700(ActivityThread.java:135)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at android.os.Handler.dispatchMessage(Handler.java:102)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at android.os.Looper.loop(Looper.java:137)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at android.app.ActivityThread.main(ActivityThread.java:4998)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at java.lang.reflect.Method.invokeNative(Native Method)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at java.lang.reflect.Method.invoke(Method.java:515)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at dalvik.system.NativeStart.main(Native Method)
12-29 01:27:21.194: E/AndroidRuntime(1362): Caused by: android.database.sqlite.SQLiteException: duplicate column name: day (code 1): , while compiling: create table if not exists price_table ( _id integer primary key autoincrement, day text, month text, day text, subcategory text, item text, price text, quantity text, weight text, volume text, sale text, store text, extra text)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1672)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1603)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at com.unsuccessfulstudent.grocerypricehistory.DbPrice.onCreate(DbPrice.java:49)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at com.unsuccessfulstudent.grocerypricehistory.AddItem.onCreate(AddItem.java:31)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at android.app.Activity.performCreate(Activity.java:5243)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
12-29 01:27:21.194: E/AndroidRuntime(1362):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
12-29 01:27:21.194: E/AndroidRuntime(1362):     ... 11 more
12-29 01:27:24.554: I/Process(1362): Sending signal. PID: 1362 SIG: 9

最佳答案

应用程序崩溃的原因是在数据库创建查询中两次定义相同的键。这就是您收到重复列错误的原因。

您拥有的两个键,即 DAYYEAR 具有相同的值 day。数据库中不能有两列同名。因此,要解决此问题,您所需要做的就是将 YEAR 定义更改为 -

public static final String YEAR = "year";  

希望这有帮助!!!

关于java - Android 应用程序 SQLite 数据库创建崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20822962/

相关文章:

Java:使用 DataOutputStream 写入套接字速度变慢,然后停止

Android 菜单文本颜色更改

java - 在android中动态添加缩略图

java - Java中没有明显最大长度的正则表达式后视

java - 通过 Python 或 Perl 客户端执行 java 方法

android - 当我的应用收到广播消息时如何创建通知

java - 如何自动将 'implementation' 行添加到新项目

php - Eclipse “must-have” PHP 开发工具/插件

java - 启动电子邮件 Intent 时出现 ClassCastException

java - 循环后写入字符串