即使在创建之后,表中也没有列

问题描述 投票:0回答:2

我正在使用java在Android Studio中制作应用程序。我创建了一个包含两列(name和productID)的内部数据库,一切正常。当我再添加两列(客户名称和交货日期)时,它会一直崩溃。该活动的代码如下以及logcat。

package com.kristar.busibooks;

import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import android.widget.Toast;


public class OrderActivity extends AppCompatActivity implements View.OnClickListener {

private EditText editCusTextName;
private EditText editTextName;
private EditText editTextAdd;
private EditText editDDTextName;
private Button btnAdd;
private Button btnView;
private Button btnCurrency;

private SQLiteDatabase db;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.content_order);

    createDatabase();

    editCusTextName = (EditText) findViewById(R.id.editCusTextName);
    editTextName = (EditText) findViewById(R.id.editTextName);
    editTextAdd = (EditText) findViewById(R.id.editTextpID);
    editDDTextName = (EditText) findViewById(R.id.editDDTextName);


    btnAdd = (Button) findViewById(R.id.btnAdd);
    btnView = (Button) findViewById(R.id.btnView);
    btnCurrency = (Button) findViewById(R.id.btnCurrency);

    btnAdd.setOnClickListener(this);
    btnView.setOnClickListener(this);
    btnCurrency.setOnClickListener(this);



    btnView.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Intent intentProduct = new Intent(getApplicationContext(), Products.class);
            startActivity(intentProduct);
        }
    });

    btnCurrency.setOnClickListener(new View.OnClickListener(){
        public void onClick(View v){
            Intent intentCurrencyConverter = new Intent(getApplicationContext(), CurrencyConverter.class);
            startActivity(intentCurrencyConverter);
        }
    });





}



protected void createDatabase(){
    db=openOrCreateDatabase("ProductDB", Context.MODE_PRIVATE, null);
    db.execSQL("CREATE TABLE IF NOT EXISTS product(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, Custo_name VARCHAR, name VARCHAR,productID INT, Deli_Date DATE);");
}


protected void insertIntoDB(){
    String cus_name = editCusTextName.getText().toString().trim();
    String name = editTextName.getText().toString().trim();
    String add = editTextAdd.getText().toString().trim();
    String d_date = editDDTextName.getText().toString().trim();
    if(cus_name.equals("") || name.equals("") || add.equals("") || d_date.equals("")){
        Toast.makeText(getApplicationContext(),"Please fill all fields", Toast.LENGTH_LONG).show();
        return;
    }

    String query = "INSERT INTO product (Custo_name,name,productID,Deli_Date) VALUES('"+cus_name+"', '"+name+"', '"+add+"', '"+d_date+"');";
    db.execSQL(query);
    Toast.makeText(getApplicationContext(),"Saved Successfully", Toast.LENGTH_LONG).show();
}



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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

@Override
public void onClick(View v) {
    if(v == btnAdd){
        insertIntoDB();
    }
}

}

06-06 05:32:15.095 2362-2362/com.kristar.busibooks I/art: Not 

late-enabling -Xcheck:jni (already on)
06-06 05:32:15.096 2362-2362/com.kristar.busibooks I/art: Late-enabling JIT
06-06 05:32:15.175 2362-2362/com.kristar.busibooks I/art: JIT created with code_cache_capacity=2MB compile_threshold=1000
06-06 05:32:15.592 2362-2362/com.kristar.busibooks W/System: ClassLoader referenced unknown path: /data/app/com.kristar.busibooks-2/lib/x86
06-06 05:32:16.065 2362-2373/com.kristar.busibooks I/art: WaitForGcToComplete blocked for 46.015ms for cause Background
06-06 05:32:17.134 2362-2376/com.kristar.busibooks D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
06-06 05:32:17.163 2362-2373/com.kristar.busibooks I/art: Background sticky concurrent mark sweep GC freed 9565(411KB) AllocSpace objects, 0(0B) LOS objects, 31% free, 2MB/3MB, paused 120.897ms total 1.085s
06-06 05:32:17.212 2362-2362/com.kristar.busibooks D/: HostConnection::get() New Host Connection established 0xab74d8e0, tid 2362
06-06 05:32:17.448 2362-2376/com.kristar.busibooks D/: HostConnection::get() New Host Connection established 0xab74dcb0, tid 2376
06-06 05:32:17.466 2362-2376/com.kristar.busibooks I/OpenGLRenderer: Initialized EGL, version 1.4
06-06 05:32:17.645 2362-2376/com.kristar.busibooks W/EGL_emulation: eglSurfaceAttrib not implemented
06-06 05:32:17.645 2362-2376/com.kristar.busibooks W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xabe7f900, error=EGL_SUCCESS
06-06 05:32:18.820 2362-2362/com.kristar.busibooks I/Choreographer: Skipped 64 frames!  The application may be doing too much work on its main thread.
06-06 05:32:24.125 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 7.568ms
06-06 05:32:24.333 2362-2376/com.kristar.busibooks W/EGL_emulation: eglSurfaceAttrib not implemented
06-06 05:32:24.333 2362-2376/com.kristar.busibooks W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xad6d1620, error=EGL_SUCCESS
06-06 05:32:24.682 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 35.944ms
06-06 05:32:26.172 2362-2362/com.kristar.busibooks I/Choreographer: Skipped 95 frames!  The application may be doing too much work on its main thread.
06-06 05:32:26.568 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 12.282ms
06-06 05:32:27.091 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 16.750ms
06-06 05:32:29.126 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 13.683ms
06-06 05:32:34.472 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 25.061ms
06-06 05:32:34.943 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 6.799ms
06-06 05:32:37.274 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 5.115ms
06-06 05:32:38.558 2362-2376/com.kristar.busibooks E/Surface: getSlotFromBufferLocked: unknown buffer: 0xab755640
06-06 05:32:39.187 2362-2362/com.kristar.busibooks I/Choreographer: Skipped 201 frames!  The application may be doing too much work on its main thread.
06-06 05:32:41.686 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 27.114ms
06-06 05:32:45.302 2362-2376/com.kristar.busibooks W/EGL_emulation: eglSurfaceAttrib not implemented
06-06 05:32:45.302 2362-2376/com.kristar.busibooks W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xad6f0720, error=EGL_SUCCESS
06-06 05:32:45.485 2362-2376/com.kristar.busibooks E/Surface: getSlotFromBufferLocked: unknown buffer: 0xab755640
06-06 05:32:46.455 2362-2376/com.kristar.busibooks W/EGL_emulation: eglSurfaceAttrib not implemented
06-06 05:32:46.455 2362-2376/com.kristar.busibooks W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xad6f0720, error=EGL_SUCCESS
06-06 05:32:46.551 2362-2376/com.kristar.busibooks E/Surface: getSlotFromBufferLocked: unknown buffer: 0xab754920
06-06 05:32:46.703 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 77.331ms
06-06 05:32:46.739 2362-2362/com.kristar.busibooks I/Choreographer: Skipped 37 frames!  The application may be doing too much work on its main thread.
06-06 05:32:46.830 2362-2373/com.kristar.busibooks I/art: Background partial concurrent mark sweep GC freed 4946(325KB) AllocSpace objects, 0(0B) LOS objects, 39% free, 3MB/5MB, paused 26.008ms total 568.072ms
06-06 05:32:47.154 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 37.891ms
06-06 05:32:47.737 2362-2362/com.kristar.busibooks I/Choreographer: Skipped 58 frames!  The application may be doing too much work on its main thread.
06-06 05:32:53.132 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 33.821ms
06-06 05:32:54.141 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 32.107ms
06-06 05:32:57.998 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 29.788ms
06-06 05:32:58.477 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 5.348ms
06-06 05:33:06.832 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 57.211ms
06-06 05:33:06.841 2362-2362/com.kristar.busibooks E/SQLiteLog: (1) table product has no column named Custo_name
06-06 05:33:06.842 2362-2362/com.kristar.busibooks D/AndroidRuntime: Shutting down VM
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime: FATAL EXCEPTION: main
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime: Process: com.kristar.busibooks, PID: 2362
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime: android.database.sqlite.SQLiteException: table product has no column named Custo_name (code 1): , while compiling: INSERT INTO product (Custo_name,name,productID,Deli_Date) VALUES('fg', 'gh', '56', '2017-11-12');
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime:     at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime:     at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887)
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime:     at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498)
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime:     at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime:     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime:     at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime:     at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674)
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime:     at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1605)
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime:     at com.kristar.busibooks.OrderActivity.insertIntoDB(OrderActivity.java:91)
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime:     at com.kristar.busibooks.OrderActivity.onClick(OrderActivity.java:122)
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime:     at android.view.View.performClick(View.java:5198)
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:21147)
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:148)
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5417)
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
06-06 05:33:06.843 2362-2362/com.kristar.busibooks E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
06-06 05:33:09.908 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 7.133ms
06-06 05:33:12.921 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 43.865ms
06-06 05:33:14.574 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 7.056ms
06-06 05:33:15.794 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 14.265ms
06-06 05:33:22.451 2362-2369/com.kristar.busibooks W/art: Suspending all threads took: 13.150ms
java android sql database
2个回答
1
投票

首次安装应用程序时,您的表已在没有这些列的情况下创建。您需要升级表,然后添加这些列或使用更新的表模式重新安装应用程序。


0
投票

在你的代码中,

openOrCreateDatabase()

仅当该数据库不存在时才创建新数据库。

CREATE TABLE IF NOT EXISTS

不改变旧表,它只创建一个新表,如果它甚至不存在

在您的代码指定或卸载应用程序之前,不会删除应用程序的数据库或其表格。

如果你想保留旧条目

改用ALTER TABLE,

或者你可以卸载应用程序然后从Android工作室运行。

© www.soinside.com 2019 - 2024. All rights reserved.