android - 使用 SharedPreferences 将值插入 SQLite 时出错

标签 android sqlite

我是 SharedPreferences 和 SQLite 的新手。

我已经引用在线示例实现了 SharedPreferences。

当我调试期望配置文件时(我得到配置文件的“默认”值),所有其他值都是正确的,因为我从我的设备插入
但是当我按下一个按钮时,它会抛出一些错误。

我用谷歌搜索,但没有得到预期的任何答案。
请帮助我了解我在哪里犯了错误。

DBHandler 类

  package com.example.app;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.sql.Blob;
import java.sql.SQLData;

import android.R.raw;
import android.app.Activity;
import android.app.Application;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.preference.PreferenceManager.OnActivityResultListener;
import android.text.StaticLayout;
import android.util.Log;
import android.widget.Toast;

public class DBHandler extends SQLiteOpenHelper{


    public static int VERSION_NAME=1;
    public static String DATABASE_NAME="altaf";
    public static String TABLE_REGISTER="register";
    public static String PERSON_ID="_PersonId";
    public static String PERSON_FNAME="FirstName";
    public static String PERSON_EMAIL="EmaiId";
    public static String PERSON_PASSWORD="Password";
    public static String PERSON_PHOTO="Photo";
    public static String PERSON_GENDER="Gender";
    public static String PERSON_COUNTRY="Country";
    public static String PERSON_STATE="State";
    public static String PERSON_CITY="City";
    public static String PERSON_S_QUE="Squestion";
    public static String PERSON_DOB="dob";
    public static String PERSON_UNAME="Uname";



    Context context;

    public DBHandler(Context context) {
        super(context, DATABASE_NAME, null, VERSION_NAME);
        // TODO Auto-generated constructor stub


    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        try{
        String create_table="CREATE TABLE " + TABLE_REGISTER + "(" + PERSON_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + PERSON_FNAME + " TEXT NOT NULL," + PERSON_EMAIL + " TEXT NOT NULL," + PERSON_PASSWORD + " TEXT NOT NULL," + PERSON_PHOTO + " blob not null," + PERSON_GENDER + " TEXT NOT NULL," + PERSON_COUNTRY + " TEXT NOT NULL," + PERSON_STATE + " TEXT NOT NULL," + PERSON_CITY + " TEXT NOT NULL," + PERSON_S_QUE + " TEXT NOT NULL," + PERSON_DOB + " DATE," + PERSON_UNAME + " TEXT NOT NULL )";
        db.execSQL(create_table);
        }
        catch(Exception e)
        {
            Log.e("failed to create table", e.toString());

        }
    }

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


    public void insert(String fname,String email,String pwd,String profile,String gender,String country,String state,String city,String sec_que,String dob,String uname) throws SQLException{

        SQLiteDatabase db=this.getWritableDatabase();
        ContentValues cv=new ContentValues();
        cv.put(PERSON_FNAME, fname);
        cv.put(PERSON_EMAIL, email);
        cv.put(PERSON_PASSWORD, pwd);
        cv.put(PERSON_PHOTO, profile);
        cv.put(PERSON_GENDER, gender);
        cv.put(PERSON_COUNTRY, country);
        cv.put(PERSON_STATE, state);
        cv.put(PERSON_CITY, city);
        cv.put(PERSON_COUNTRY, sec_que);
        cv.put(PERSON_STATE, dob);
        cv.put(PERSON_CITY, uname);
        db.insert(TABLE_REGISTER, null, cv);

        db.close();}

mainActivity class

    package com.example.app;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Parcelable;
import android.provider.MediaStore;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

    EditText e_fname,e_pwd,e_email;
    Button b_register;
    final int one=1;
    public static String msg="success";
    public static String error="unsuccess";

    CheckBox c_agree,c_spwd;
    TextView t_tc;




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

        e_fname=(EditText)findViewById(R.id.r_e_fnm);
        e_pwd=(EditText)findViewById(R.id.r_e_pwd);
        e_email=(EditText)findViewById(R.id.r_e_email);
        b_register=(Button)findViewById(R.id.b_register);
        c_agree=(CheckBox)findViewById(R.id.r_ch_agree);
        c_spwd=(CheckBox)findViewById(R.id.r_ch_spwd);
        t_tc=(TextView)findViewById(R.id.r_t_tc);

        final DBHandler handler=new DBHandler(this);
        SQLiteDatabase db=handler.getWritableDatabase();
        SharedPreferences pref=getApplicationContext().getSharedPreferences("pref", MODE_PRIVATE);
        final Editor editor=pref.edit();



        c_spwd.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub
                if(!isChecked)
                {
                    e_pwd.setTransformationMethod(PasswordTransformationMethod.getInstance());
                }else
                {
                    e_pwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                }
            }
        });


        b_register.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                String fname,pwd,email;
                fname=e_fname.getText().toString();
                email=e_email.getText().toString();
                pwd=e_pwd.getText().toString();

                if(fname.equals("")|| email.equals("")||pwd.equals(""))
                {
                    e_fname.setError("field is required");
                    e_pwd.setError("field is required");
                    e_email.setError("field is required");
                }
                else
                {
                    String PERSON_FNAME="FirstName";
                    String PERSON_EMAIL="EmaiId";
                    String PERSON_PASSWORD="Password";



                    editor.putString(PERSON_FNAME, fname);
                    editor.putString(PERSON_EMAIL, email);
                    editor.putString(PERSON_PASSWORD, pwd);
                    editor.apply();

                Toast.makeText(getApplication(), fname+ "  "  + "Is Redirecting", Toast.LENGTH_SHORT).show();
                Intent i=new Intent(MainActivity.this,reg1.class);
                startActivity(i);
                }
            }
        });
    }

reg1 类

package com.example.app;

import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.Toast;



    public class reg1 extends

     Activity{

        public static String GEENDER="gender";
        public static String imgDecodableString="imgDecodableStringr";
        //public static String GEENDER="gender";
        public static int RESULT_LOAD_IMG = 1;
        Intent data ;
        ImageView imageView;
        Button register1;

        Uri selectedImage ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setContentView(R.layout.reg_1);
        imageView=(ImageView)findViewById(R.id.img_select);
        register1=(Button)findViewById(R.id.b_r1_add);


        SharedPreferences sp1=getApplication().getSharedPreferences("pref", MODE_PRIVATE);
        final Editor editor=sp1.edit();
        imageView.setOnClickListener(new OnClickListener() {

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

                loadimagefrmgallery(v);

            }
        });

        final RadioButton female=(RadioButton)findViewById(R.id.imageView1);
        final RadioButton male=(RadioButton)findViewById(R.id.imageView2);
        male.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub


                if(male.isChecked())
                {
                    male.setChecked(true);
                    GEENDER="male";
                    female.setChecked(false);
                }

            }
        });
        female.setOnCheckedChangeListener(new  OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub

                if(female.isChecked())
                {
                    female.setChecked(true);
                    GEENDER="female";
                    male.setChecked(false);
                }
            }
        });



        register1.setOnClickListener(new OnClickListener() {

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

                DBHandler handler=new DBHandler(getApplicationContext());
                SQLiteDatabase db=handler.getWritableDatabase();
                Bitmap bitmap=BitmapFactory.decodeFile(imgDecodableString);
                // convert bitmap to byte
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
                byte imageInByte[] = stream.toByteArray();

                String image = null;
                try {
                    image = new String(imageInByte, "UTF");
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }



                String PERSON_PHOTO="Photo";
                String PERSON_GENDER="Gender";


                editor.putString(PERSON_PHOTO, image);
                editor.putString(PERSON_GENDER, GEENDER);
                editor.apply();
                Toast.makeText(getApplicationContext(),  "moving", Toast.LENGTH_SHORT).show();
                Intent i=new Intent(reg1.this,reg2.class);
                startActivity(i);

            }
        });


    }

reg2 类

    package com.example.app;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.Toast;
import android.widget.AdapterView.OnItemSelectedListener;

public class reg2 extends Activity{

    Spinner s_con,s_stat,s_ct;
    Button register2;
    public static String country1,state1,city1;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setContentView(R.layout.reg_2);

        s_con=(Spinner)findViewById(R.id.r_spin_con);
        s_stat=(Spinner)findViewById(R.id.r_spin_stat);
        s_ct=(Spinner)findViewById(R.id.r_spin_ct);
        register2=(Button)findViewById(R.id.b_r2_add);

        SharedPreferences sp2=getApplication().getSharedPreferences("pref", MODE_PRIVATE);
        final Editor editor=sp2.edit();


        ArrayList<String>a=new ArrayList<String>();
        ArrayList<String>a1=new ArrayList<String>();
        ArrayList<String>a2=new ArrayList<String>();
        a.add("India");
        a.add("England");
        a.add("USA");
        a.add("Pakistan");
        a1.add("Panjab");
        a1.add("gujarat");
        a1.add("Berkshire");
        a2.add("surat");
        a2.add("great manchester");
        a2.add("london");


        final ArrayAdapter<String>adapter1=new ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item,a1);
        final ArrayAdapter<String>adapter2=new ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item,a2);
        final ArrayAdapter<String>adapter=new ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item,a);
        s_con.setAdapter(adapter);
        s_stat.setAdapter(adapter1);
        s_ct.setAdapter(adapter2);

        s_con.setOnItemSelectedListener(new  OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id) {
                // TODO Auto-generated method stub


                country1=parent.getItemAtPosition(position).toString();
                Toast.makeText(getApplicationContext(), country1, Toast.LENGTH_SHORT).show();

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                // TODO Auto-generated method stub

            }
        });

        s_stat.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id) {
                // TODO Auto-generated method stub
                state1=parent.getItemAtPosition(position).toString();
                Toast.makeText(getApplicationContext(), state1, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                // TODO Auto-generated method stub

            }
        });
        s_ct.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id) {
                // TODO Auto-generated method stub

                 city1=parent.getItemAtPosition(position).toString();
                 Toast.makeText(getApplicationContext(), city1, Toast.LENGTH_SHORT).show();

            }


            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                // TODO Auto-generated method stub

            }
        });







        register2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                DBHandler handler=new DBHandler(getApplicationContext());
                SQLiteDatabase db=handler.getWritableDatabase();



                String PERSON_COUNTRY="Country";
                String PERSON_STATE="State";
                String PERSON_CITY="City";


                editor.putString(PERSON_COUNTRY, country1);
                editor.putString(PERSON_STATE, state1 );
                editor.putString(PERSON_CITY, city1 );
                editor.apply();

                Toast.makeText(getApplicationContext(), "moving", Toast.LENGTH_SHORT).show();
                Intent i=new Intent(reg2.this,reg3.class);
                startActivity(i);

            }
        });

}}

reg3 类

    package com.example.app;

import java.io.IOException;
import java.util.ArrayList;

import android.R.integer;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

public class reg3 extends Activity {

    Spinner s_sq;
    EditText dob,unm;
    Button register3;
    public static String PREF="pref";
    public static String def_val="default";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.reg_3);

        s_sq=(Spinner)findViewById(R.id.r_spin_sq);
        dob=(EditText) findViewById(R.id.r_e_dob);
        unm=(EditText) findViewById(R.id.editText1);
        register3=(Button)findViewById(R.id.b_add3);
        ArrayList<String>a=new ArrayList<String>();
        final ArrayAdapter<String>adapter=new ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item,a);
        a.add("when were you born?");
        a.add("what is your nick name?");
        a.add("what is your childhood name");
        a.add("what city your parents were met");
        a.add("what is your city name");
        s_sq.setAdapter(adapter);

        final SharedPreferences pref=getApplication().getSharedPreferences(PREF, MODE_PRIVATE);
        final SharedPreferences pref1=getApplication().getSharedPreferences(PREF, MODE_PRIVATE);
        final SharedPreferences pref2=getApplication().getSharedPreferences(PREF, MODE_PRIVATE);


        register3.setOnClickListener(new OnClickListener() {

            @SuppressWarnings("static-access")
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                DBHandler handler=new DBHandler(getApplicationContext());
                SQLiteDatabase db=handler.getWritableDatabase();
                String dob1=dob.getText().toString();
                String uname=unm.getText().toString();
                String sec_que=s_sq.getSelectedItem().toString();

                String PERSON_FNAME="FirstName";
                String PERSON_EMAIL="EmaiId";
                String PERSON_PASSWORD="Password";
                String PERSON_PHOTO="Photo";
                String PERSON_GENDER="Gender";
                String PERSON_COUNTRY="Country";
                String PERSON_STATE="State";
                String PERSON_CITY="City";


                String fname=pref.getString(PERSON_FNAME, def_val);
                String email=pref.getString(PERSON_EMAIL, def_val);
                String pwd=pref.getString(PERSON_PASSWORD, def_val);
                String profile=pref1.getString(PERSON_PHOTO, def_val);
                String gender=pref1.getString(PERSON_GENDER, def_val);
                String country=pref2.getString(PERSON_COUNTRY, def_val);
                String state=pref2.getString(PERSON_STATE, def_val);
                String city=pref2.getString(PERSON_CITY, def_val);

                handler.insert(fname, email, pwd, profile, gender, country, state, city, sec_que, dob1, uname);


                Intent i=new Intent(reg3.this,home.class);
                startActivity(i);

                Toast.makeText(getApplicationContext(),"Registered", Toast.LENGTH_LONG).show();
            }
        });

    }

}

日志

11-18 02:09:55.846: E/SQLiteDatabase(23920): Error inserting EmaiId=a State=1/1/1992 Gender=male Password=a FirstName=a Country=what is your childhood name Photo=default City=altu
11-18 02:09:55.846: E/SQLiteDatabase(23920): android.database.sqlite.SQLiteConstraintException: register.Squestion may not be NULL (code 19)
11-18 02:09:55.846: E/SQLiteDatabase(23920):    at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
11-18 02:09:55.846: E/SQLiteDatabase(23920):    at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:775)
11-18 02:09:55.846: E/SQLiteDatabase(23920):    at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
11-18 02:09:55.846: E/SQLiteDatabase(23920):    at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
11-18 02:09:55.846: E/SQLiteDatabase(23920):    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
11-18 02:09:55.846: E/SQLiteDatabase(23920):    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
11-18 02:09:55.846: E/SQLiteDatabase(23920):    at com.example.app.DBHandler.insert(DBHandler.java:94)
11-18 02:09:55.846: E/SQLiteDatabase(23920):    at com.example.app.reg3$1.onClick(reg3.java:84)
11-18 02:09:55.846: E/SQLiteDatabase(23920):    at android.view.View.performClick(View.java:4084)
11-18 02:09:55.846: E/SQLiteDatabase(23920):    at android.view.View$PerformClick.run(View.java:16966)
11-18 02:09:55.846: E/SQLiteDatabase(23920):    at android.os.Handler.handleCallback(Handler.java:615)
11-18 02:09:55.846: E/SQLiteDatabase(23920):    at android.os.Handler.dispatchMessage(Handler.java:92)
11-18 02:09:55.846: E/SQLiteDatabase(23920):    at android.os.Looper.loop(Looper.java:137)
11-18 02:09:55.846: E/SQLiteDatabase(23920):    at android.app.ActivityThread.main(ActivityThread.java:4745)
11-18 02:09:55.846: E/SQLiteDatabase(23920):    at java.lang.reflect.Method.invokeNative(Native Method)
11-18 02:09:55.846: E/SQLiteDatabase(23920):    at java.lang.reflect.Method.invoke(Method.java:511)
11-18 02:09:55.846: E/SQLiteDatabase(23920):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
11-18 02:09:55.846: E/SQLiteDatabase(23920):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-18 02:09:55.846: E/SQLiteDatabase(23920):    at dalvik.system.NativeStart.main(Native Method)

最佳答案

TABLE_REGISTER 一样,PERSON_S_QUE 也可用于 TEXT NOT NULL 属性,但在表中插入数据时不添加 PERSON_S_QUE ContentValues 中的列值。

在insert方法中添加如下内容:

cv.put(PERSON_S_QUE, sec_que);

关于android - 使用 SharedPreferences 将值插入 SQLite 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33777454/

相关文章:

android - 我怎么知道应用程序在不同的国家/地区启动/更新

android - 无法生成 View 绑定(bind) java.lang.IndexOutOfBoundsException

android - 如何在动态布局中动态传递颜色?

android - .如何将文件从项目 Assets 文件夹复制到android studio中的设备数据文件夹?

php - Laravel:连接到 sqlite 数据库抛出 "PDOException: Could not find driver"

android - 如果没有 @Provides 注解的方法,则无法提供 Kotlin Dagger ViewModel

android - Android ListView有没有内置 "item checked listener"?

java - 让SQLite删除表中的所有记录

javascript - 具有同步 sqlite3 调用的 node.js 脚本

python - 在 python sqlite3 中使用保存点