我的应用程序可以创建sqlite数据库android。但我遇到的问题是,数据库中的表是创建的,但值没有保存到数据库中。
我的mainactivity.java代码

package com.rough.problem.problem9;

import android.graphics.Color;
import android.graphics.PorterDuff;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    EditText Select;
    DatabaseHelper myDB;
    Button create, query, quit;

    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myDB = new DatabaseHelper(this);

      Select = (EditText) findViewById(R.id.SelectStatement);
      create = (Button) findViewById(R.id.Create);
      query = (Button) findViewById(R.id.Query);
      quit = (Button) findViewById(R.id.Quit);

     //   Select.getBackground().setColorFilter(Color.YELLOW, PorterDuff.Mode.SRC_ATOP);

        tableS tables1 = new tableS("S01", "Smith", "London");
        tableS tables2 = new tableS("S02", "Jones", "Paris");
        tableS tables3 = new tableS("S03", "Blake", "Paris");
        tableS tables4 = new tableS("S04", "Clark", "London");

        // add them
        myDB.insertdata(tables1);
        myDB.insertdata(tables2);
        myDB.insertdata(tables3);
        myDB.insertdata(tables4);

        create.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });
    }



    public boolean onCreateOptionMenu (Menu menu){
        getMenuInflater().inflate(R.menu.menu_main,menu);
        return true;
    }


    public boolean onOptionsItemSelected(MenuItem item){
        int id = item.getItemId();
        return true;
    }
}

我的databasehelper.java代码
package com.rough.problem.problem9;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;



import java.util.LinkedList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {
    public static final String DATABASE_NAME = "SPdb1.db";
    public static final String TABLE_NAME = "s";
    public static final String COL_1 = "sno";
    public static final String COL_2 = "sname";
    public static final String COL_3 = "city";



    private static final String[] COLUMNS = {COL_1, COL_2, COL_3};

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String query = "Create Table IF NOT EXISTS " + TABLE_NAME + "(" +
                COL_1 + "TEXT PRIMARY KEY COLLATE NOCASE," +
                COL_2 + "TEXT NOT NULL COLLATE NOCASE," +
                COL_3 + "TEXT NOT NULL COLLATE NOCASE" +
                ");";
        db.execSQL(query);


    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // you can implement here migration process
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }





        public void insertdata (tableS tables){
            SQLiteDatabase db = this.getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put(COL_1, tables.getSno());
            values.put(COL_2, tables.getSname());
            values.put(COL_3,tables.getCity());
            // insert
            db.insert(TABLE_NAME, null, values);
            db.close();
        }


    }

最后是tables.java
package com.rough.problem.problem9;


public class tableS {

    private String sno;
    private String sname;
    private String city;


    public tableS() {
    }

    public tableS(String sno , String sname, String city) {
        this.sno = sno;
        this.sname = sname;
        this.city = city;
    }

    public String getSno() {
        return sno;
    }

    public void setSno(String sno) {
        this.sno = sno;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }


    @Override
    public String toString() {
        return sno + " \t\t " + sname + " \t\t " + city ;
    }

}

这是数据库截图
enter image description here

最佳答案

如果运行代码并查看日志,则对于尝试插入到表中的每一行,您将得到一个错误(但不是异常,因为insert方便方法使用INSERT OR IGNORE):

07-20 05:52:18.458 1125-1125/com.rough.problem.project9 E/SQLiteLog: (1) table s has no column named sno
07-20 05:52:18.458 1125-1125/com.rough.problem.project9 E/SQLiteDatabase: Error inserting sno=S01 sname=Smith city=London
    android.database.sqlite.SQLiteException: table s has no column named sno (code 1): , while compiling: INSERT INTO s(sno,sname,city) VALUES (?,?,?)
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
        at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
        at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
        at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
        at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
        at com.rough.problem.project9.DatabaseHelper.insertdata(DatabaseHelper.java:45)
        at com.rough.problem.project9.MainActivity.onCreate(MainActivity.java:35)
        at android.app.Activity.performCreate(Activity.java:5008)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
        at android.app.ActivityThread.access$600(ActivityThread.java:130)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4745)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)

这表明列SnO在名为S.的表中不存在。原因是您省略了列名与列定义的其余部分之间的空间(对于所有列相同)。
要解决问题更改:
@Override
public void onCreate(SQLiteDatabase db) {
    String query = "Create Table IF NOT EXISTS " + TABLE_NAME + "(" +
            COL_1 + "TEXT PRIMARY KEY COLLATE NOCASE," +
            COL_2 + "TEXT NOT NULL COLLATE NOCASE," +
            COL_3 + "TEXT NOT NULL COLLATE NOCASE" +
            ");";
    db.execSQL(query);


}

致:
@Override
public void onCreate(SQLiteDatabase db) {
    String query = "Create Table IF NOT EXISTS " + TABLE_NAME + "(" +
            COL_1 + " TEXT PRIMARY KEY COLLATE NOCASE," + //<<<<<<<<<< ADDED SPACE
            COL_2 + " TEXT NOT NULL COLLATE NOCASE," + //<<<<<<<<<< ADDED SPACE
            COL_3 + " TEXT NOT NULL COLLATE NOCASE" + //<<<<<<<<<< ADDED SPACE
            ");";
    db.execSQL(query);
}

更改后,请删除应用程序的数据或卸载该应用程序,然后重新运行。

关于android - 我正在做一个作业,我必须创建只读的sqlite数据库,而不会提示用户输入数据。,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51433221/

10-12 03:44
查看更多