将数据插入SQLite数据库,数据类型不匹配 [英] Inserting data into SQLite database, datatype mismatch

查看:3277
本文介绍了将数据插入SQLite数据库,数据类型不匹配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想将数据插入到数据库中使用SQLite,但我无法做到这一点。 I $ pssed在我创建输入,但数据无法发送到数据库中的按钮p $。我已经通过了LogCat中读取并说类似的数据类型不匹配,我不知道哪个数据类型的含义。

下面是我的code:

database.java

 公共类的数据库{

    公共静态最后弦乐MOVIE_NAME =MNAME;

    私有静态最后弦乐DATABASE_NAME =电影;
    私有静态最后弦乐DATABASE_TABLE =mList;
    私有静态最终诠释DATABASE_VERSION = 1;

    私人数据库DB;
    私人最终语境续;
    私人SQLiteDatabase moviedatabase;

    公共静态类数据库扩展SQLiteOpenHelper {

        公共数据库(上下文的背景下){
            超(背景下,DATABASE_NAME,空,DATABASE_VERSION);
            // TODO自动生成构造函数存根
        }

        @覆盖
        公共无效的onCreate(SQLiteDatabase DB){
            // TODO自动生成方法存根
            db.execSQL(CREATE TABLE+ DATABASE_TABLE +(+
                    MOVIE_NAME +TEXT NOT NULL);
            );
        }

        @覆盖
        公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){
            // TODO自动生成方法存根
            db.execSQL(DROP TABLE IF EXISTS+ DATABASE_NAME);
        }

    }

    公共数据库(上下文CON){
        CONT = CON;
    }

    公共数据库的open()抛出异常{
        DB =新的数据库(续);
        moviedatabase = db.getWritableDatabase();
        回到这一点;
    }
    公共无效的close(){
        db.close();
    }

    公共无效createEntry(字符串输入){
        // TODO自动生成方法存根
        ContentValues​​内容=新ContentValues​​();
        content.put(MOVIE_NAME,输入);
        moviedatabase.insert(DATABASE_TABLE,空,内容);
    }

    公共字符串的getData(){
        // TODO自动生成方法存根


        的String []山口=新的String [] {} MOVIE_NAME;
        光标小人= moviedatabase.query(DATABASE_TABLE,COL,NULL,NULL,NULL,NULL,NULL);
        字符串资源=;
        INT的rowNum = curs.getColumnIndex(MOVIE_NAME);

        为(curs.moveToFirst();!curs.isAfterLast(); curs.moveToNext()){
            RES = RES + curs.getString(的rowNum)+\ N的;
        }

        返回水库;
    }
 

insert.java

 公共类插件扩展了活动{

    按钮insBtn;
    的EditText插图;
    @覆盖
    保护无效的onCreate(包savedInstanceState){
        // TODO自动生成方法存根
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.insert);

        插图=(EditText上)findViewById(R.id.insertET);
        insBtn =(按钮)findViewById(R.id.insertBtn);

        insBtn.setOnClickListener(新View.OnClickListener(){

            @覆盖
            公共无效的onClick(视图v){
                // TODO自动生成方法存根

                尝试{
                    字符串输入= insET.getText()的toString()。

                    数据库newEntry =新的数据库(insert.this);
                    newEntry.open();
                    newEntry.createEntry(输入);
                    newEntry.close();
                }赶上(例外五){
                    e.printStackTrace();
                }
            }
        });
    }
 

list.java

 公共类列表扩展活动{
    @覆盖
    保护无效的onCreate(包savedInstanceState){
        // TODO自动生成方法存根
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.list);

        TextView的D =(TextView中)findViewById(R.id.movi​​eName);
        数据库电影=新的数据库(本);

        尝试{
            movies.open();
            字符串数据= movies.getData();
            movies.close();
            d.setText(数据);
        }赶上(例外五){
            e.printStackTrace();
        }
    }

}
 

LogCat中:

 七月3日至16号:28:17.617:E / SQLiteLog(3194):(20)语句中止6:[(?)INSERT INTO mList(MNAME)VALUES]数据类型不匹配
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):错误插入MNAME = dfsefsd
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):android.database.sqlite.SQLiteDatatypeMismatchException:数据类型不匹配(code 20)
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):在android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(本机方法)
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):在android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:775)
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):在android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):在android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):在android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):在android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):在com.example.project.database.createEntry(database.java:63)
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):在com.example.project.insert $ 1.onClick(insert.java:34)
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):在android.view.View.performClick(View.java:4204)
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):在android.view.View $ PerformClick.run(View.java:17355)
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):在android.os.Handler.handleCallback(Handler.java:725)
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):在android.os.Handler.dispatchMessage(Handler.java:92)
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):在android.os.Looper.loop(Looper.java:137)
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):在android.app.ActivityThread.main(ActivityThread.java:5041)
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):在java.lang.reflect.Method.invokeNative(本机方法)
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):在java.lang.reflect.Method.invoke(Method.java:511)
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793)
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
7月3号至16日:28:17.635:E / SQLiteDatabase(3194):在dalvik.system.NativeStart.main(本机方法)
7月3号至16日:28:26.418:I /编舞(3194):跳过33帧!该应用程序可能会做它的主线程的工作太多了。
 

解决方案

首先开始改变你的code从

  db.execSQL(DROP TABLE IF EXISTS+ DATABASE_NAME);
 

  db.execSQL(DROP TABLE IF EXISTS+ DATABASE_TABLE);
 

好机会,这解释了数据类型错误。

I wanted to insert data into the database using SQLite but i fail to do it. I pressed on the button I've created to input but the data could not be sent into the database. I've read through the LogCat and it says something like data type mismatch, I have no idea which data type it means.

Here is my code :

database.java

public class database {

    public static final String MOVIE_NAME = "mName";

    private static final String DATABASE_NAME = "Movie";
    private static final String DATABASE_TABLE = "mList";
    private static final int DATABASE_VERSION = 1;

    private Database db;
    private final Context cont;
    private SQLiteDatabase moviedatabase;

    public static class Database extends SQLiteOpenHelper{

        public Database(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
            // TODO Auto-generated constructor stub
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +
                    MOVIE_NAME + " TEXT NOT NULL);"
            );
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
            db.execSQL("DROP TABLE IF EXISTS " + DATABASE_NAME);
        }

    }

    public database(Context con){
        cont = con;
    }

    public database open() throws Exception{
        db = new Database(cont);
        moviedatabase = db.getWritableDatabase();
        return this;
    }
    public void close(){
        db.close();
    }

    public void createEntry(String input) {
        // TODO Auto-generated method stub
        ContentValues content = new ContentValues();
        content.put(MOVIE_NAME, input);
        moviedatabase.insert(DATABASE_TABLE, null, content);
    }

    public String getData() {
        // TODO Auto-generated method stub


        String[] col = new String[]{MOVIE_NAME};
        Cursor curs = moviedatabase.query(DATABASE_TABLE, col, null, null, null, null, null);
        String res = "";
        int rowNum = curs.getColumnIndex(MOVIE_NAME);

        for(curs.moveToFirst(); !curs.isAfterLast(); curs.moveToNext()){
            res = res + curs.getString(rowNum) + "\n";
        }

        return res;
    }

insert.java

public class insert extends Activity{

    Button insBtn;
    EditText insET;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.insert);

        insET = (EditText) findViewById(R.id.insertET);
        insBtn = (Button) findViewById(R.id.insertBtn);

        insBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                try{
                    String input = insET.getText().toString();

                    database newEntry = new database(insert.this);
                    newEntry.open();
                    newEntry.createEntry(input);
                    newEntry.close();
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        });
    }

list.java

public class list extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list);

        TextView d = (TextView) findViewById(R.id.movieName);
        database movies = new database(this);

        try{
            movies.open();
            String data = movies.getData();
            movies.close();
            d.setText(data);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}

LogCat:

03-16 07:28:17.617: E/SQLiteLog(3194): (20) statement aborts at 6: [INSERT INTO mList(mName) VALUES (?)] datatype mismatch
03-16 07:28:17.635: E/SQLiteDatabase(3194): Error inserting mName=dfsefsd
03-16 07:28:17.635: E/SQLiteDatabase(3194): android.database.sqlite.SQLiteDatatypeMismatchException: datatype mismatch (code 20)
03-16 07:28:17.635: E/SQLiteDatabase(3194):     at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
03-16 07:28:17.635: E/SQLiteDatabase(3194):     at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:775)
03-16 07:28:17.635: E/SQLiteDatabase(3194):     at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
03-16 07:28:17.635: E/SQLiteDatabase(3194):     at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
03-16 07:28:17.635: E/SQLiteDatabase(3194):     at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
03-16 07:28:17.635: E/SQLiteDatabase(3194):     at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
03-16 07:28:17.635: E/SQLiteDatabase(3194):     at com.example.project.database.createEntry(database.java:63)
03-16 07:28:17.635: E/SQLiteDatabase(3194):     at com.example.project.insert$1.onClick(insert.java:34)
03-16 07:28:17.635: E/SQLiteDatabase(3194):     at android.view.View.performClick(View.java:4204)
03-16 07:28:17.635: E/SQLiteDatabase(3194):     at android.view.View$PerformClick.run(View.java:17355)
03-16 07:28:17.635: E/SQLiteDatabase(3194):     at android.os.Handler.handleCallback(Handler.java:725)
03-16 07:28:17.635: E/SQLiteDatabase(3194):     at android.os.Handler.dispatchMessage(Handler.java:92)
03-16 07:28:17.635: E/SQLiteDatabase(3194):     at android.os.Looper.loop(Looper.java:137)
03-16 07:28:17.635: E/SQLiteDatabase(3194):     at android.app.ActivityThread.main(ActivityThread.java:5041)
03-16 07:28:17.635: E/SQLiteDatabase(3194):     at java.lang.reflect.Method.invokeNative(Native Method)
03-16 07:28:17.635: E/SQLiteDatabase(3194):     at java.lang.reflect.Method.invoke(Method.java:511)
03-16 07:28:17.635: E/SQLiteDatabase(3194):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-16 07:28:17.635: E/SQLiteDatabase(3194):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-16 07:28:17.635: E/SQLiteDatabase(3194):     at dalvik.system.NativeStart.main(Native Method)
03-16 07:28:26.418: I/Choreographer(3194): Skipped 33 frames!  The application may be doing too much work on its main thread.

解决方案

First start changing your code from

db.execSQL("DROP TABLE IF EXISTS " + DATABASE_NAME);

to

db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);

Good chance this explains the datatype error.

这篇关于将数据插入SQLite数据库,数据类型不匹配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆