【问题标题】:Data doesn't get saved in database, which it did before, but after I updated the database version it doesn't数据没有保存在数据库中,它以前做过,但是在我更新数据库版本之后它没有
【发布时间】:2021-02-15 22:19:44
【问题描述】:

感谢您帮助我解决问题!

问题 问题是数据永远不会被保存到数据库中,它以前这样做过,但后来我更新了数据库版本,现在它没有。

是否抛出了错误?是的,它就在下方。

E/SQLiteLog: (1) near "0": syntax error
E/SQLiteDatabase: Error inserting 0=20 id=csdfergeg userid=csdfergeg email=erregegergr
    android.database.sqlite.SQLiteException: near "0": syntax error (code 1): , while compiling: INSERT INTO Info(0,id,userid,email) VALUES (?,?,?,?)
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:890)
        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:501)
        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:1546)
        at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1417)
        at com.vikkivuk.mxelevator.Database.addUserInfo(Database.java:50)
        at com.vikkivuk.mxelevator.finishScene$1.onClick(finishScene.java:61)
        at android.view.View.performClick(View.java:6294)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
        at android.view.View$PerformClick.run(View.java:24770)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

我的代码:

Database Class:

    package com.vikkivuk.mxelevator;

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

import androidx.annotation.Nullable;

import java.util.ArrayList;
import java.util.List;

public class Database extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 5;
    private static final String DATABASE_NAME = "UserInfo";
    private static final String TABLE_NAME = "Info";
    private static final String KEY_ID = "id";
    private static final String KEY_USERID = "userid";
    private static final String KEY_EMAIL = "email";
    private static final String KEY_CODE = "code";

    public Database(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_USERID + " TEXT," + KEY_EMAIL + " TEXT," + Integer.parseInt(KEY_CODE) + " TEXT" + ")";
        db.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);

        onCreate(db);
    }

    public void addUserInfo(UserInfo info){
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues contentValues = new ContentValues();
        contentValues.put(KEY_ID, info.UserId);
        contentValues.put(KEY_EMAIL, info.Email);
        contentValues.put(KEY_USERID, info.UserId);
        contentValues.put(KEY_CODE, info.CODE);

        db.insert(TABLE_NAME, null, contentValues);
        db.close();
    }

    public List<UserInfo> getUserInfo(){
        List<UserInfo> results = new ArrayList<UserInfo>();

        String GET_ALL = "SELECT * FROM " + TABLE_NAME;
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(GET_ALL, null);

        if (cursor.moveToFirst()) {
            do {
                UserInfo userInfo = new UserInfo(cursor.getString(0), cursor.getString(1), cursor.getString(2), cursor.getString(3));
                results.add(userInfo);
            } while (cursor.moveToNext());
        }

        db.close();
        return results;
    }

    public void deleteUserInfo(UserInfo info){
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_NAME, KEY_ID + " = ? ", new String[] {String.valueOf(info.ID)});
        db.close();
    }
}

用户信息:

 package com.vikkivuk.mxelevator;

public class UserInfo {

    public String ID;
    public String UserId;
    public String Email;
    public String CODE;

    public UserInfo(String uid, String mail, String el_code){
        UserId = uid;
        Email = mail;
        CODE = el_code;
    }

    public UserInfo(String userId, String uid, String mail, String el_code){
        UserId = uid;
        Email = mail;
        ID = userId;
        CODE = el_code;
    }


}

用户信息适配器:

package com.vikkivuk.mxelevator;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import org.w3c.dom.Text;

import java.util.List;

public class UserInfoAdapter extends ArrayAdapter<UserInfo> {

    public UserInfoAdapter(Context context, List<UserInfo> info) {
        super(context, 0, info);
    }

    public View getView(int position, View convertView, ViewGroup parent){

        UserInfo info = getItem(position);

        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.user_info_item_row, parent, false);
        }

        TextView uid = convertView.findViewById(R.id.textview_userid);
        TextView email = convertView.findViewById(R.id.textview_email);
        TextView textcode = convertView.findViewById(R.id.codetext);

        uid.setText(info.UserId);
        email.setText(info.Email);
        textcode.setText(info.CODE);

        return convertView;
    }
}

完成场景:

package com.vikkivuk.mxelevator;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.material.snackbar.BaseTransientBottomBar;
import com.google.android.material.snackbar.Snackbar;

import java.util.Random;

public class finishScene extends AppCompatActivity {
    EditText userId, email;

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

        userId = findViewById(R.id.userid);
        email = findViewById(R.id.email);

        CheckBox agreeCheck = findViewById(R.id.agreeCheck1);
        Boolean checked = agreeCheck.isChecked();

        Button submit = findViewById(R.id.submit);
        submit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (userId.length() < 5) {
                    Toast.makeText(getApplicationContext(), "Your UID is too short!", Toast.LENGTH_SHORT).show();
                    return;
                } else if (email.length() < 6) {
                    Toast.makeText(getApplicationContext(), "Your EMAIL is too short!", Toast.LENGTH_SHORT).show();
                    return;
                } else if (!agreeCheck.isChecked()) {
                    Toast.makeText(getApplicationContext(), "Please check the agree box!", Toast.LENGTH_SHORT).show();
                    return;
                } else {
                    Random rand = new Random();
                    int int_random1 = rand.nextInt(10000);
                    int int_random2 = rand.nextInt(10);
                    int int_random3 = rand.nextInt(10);
                    int int_random4 = rand.nextInt(15);
                    int int_random5 = rand.nextInt(25);
                    int random_code = int_random1 + int_random2 + int_random3 + int_random4 + int_random5;

                    Database db = new Database(finishScene.this);
                    UserInfo info = new UserInfo(userId.getText().toString(), email.getText().toString(), String.valueOf(random_code));
                    db.addUserInfo(info);
                    db.close();
                    userId.setText("");
                    email.setText("");
                    Toast.makeText(getApplicationContext(), "Data saved! Pending approval...", Toast.LENGTH_LONG).show();
                    Intent intent = new Intent(userId.getContext(), Success.class);
                    startActivity(intent);
                }
            }
        });
    }



}

显示数据:

   package com.vikkivuk.mxelevator;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;

import java.util.List;

public class ShowData extends AppCompatActivity {

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

        List<UserInfo> info = new Database(this).getUserInfo();
        UserInfoAdapter adapter = new UserInfoAdapter(this, info);

        ListView listView = findViewById(R.id.userInfoList);
        listView.setAdapter(adapter);

        Button goback = findViewById(R.id.goback1);
        goback.setOnClickListener(v -> {
            Intent intent = new Intent(goback.getContext(), MainActivity.class);
            startActivity(intent);
        });
    }
}

这就是我所有的课程。另外,我想说明一下,自从我 3 天前开始使用 android studio 以来,我实际上并不知道数据库版本是什么。

【问题讨论】:

  • 什么是KEY_CODE?为什么你的表有一个标记为0 的列;你能给它一个有意义的名字吗?
  • KEY_CODE 是一个随机生成的代码,用户需要输入该代码才能访问应用程序的一部分。

标签: java android database


【解决方案1】:

请试试这个我对 UserInfo 类进行了一些更改 Id 必须是 integer 并且您添加 String

数据库.java

public class MyBase extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 5;
    private static final String DATABASE_NAME = "UserInfo";
    private static final String TABLE_NAME = "Info";
    private static final String KEY_ID = "id";
    private static final String KEY_USERID = "userid";
    private static final String KEY_EMAIL = "email";
    private static final String KEY_CODE = "code";

    public MyBase(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_USERID + " INTEGER," + KEY_EMAIL + " TEXT," + KEY_CODE + " TEXT" + ")";
        db.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);

        onCreate(db);
    }

    public void addUserInfo(UserInfo info) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues contentValues = new ContentValues();
        // contentValues.put(KEY_ID, info.UserId); i removed this 
        contentValues.put(KEY_EMAIL, info.Email);
        contentValues.put(KEY_USERID, info.UserId);
        contentValues.put(KEY_CODE, info.CODE);

        db.insert(TABLE_NAME, null, contentValues);

        db.close();
    }

    public List<UserInfo> getUserInfo() {
        List<UserInfo> results = new ArrayList<>();

        String GET_ALL = "SELECT * FROM " + TABLE_NAME;
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(GET_ALL, null);

        if (cursor.moveToFirst()) {
            do {
                UserInfo userInfo = new UserInfo(cursor.getInt(0), cursor.getInt(1), cursor.getString(2), cursor.getInt(3));
                results.add(userInfo);
            } while (cursor.moveToNext());
        }

        db.close();
        return results;
    }

    public void deleteUserInfo(UserInfo info) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_NAME, KEY_ID + " = ? ", new String[]{String.valueOf(info.ID)});
        db.close();
    }

}

用户信息

 public class UserInfo {

        public int ID;
        public int UserId;
        public String Email;
        public int CODE;

        public UserInfo(int uid, String mail, int el_code) {
            UserId = uid;
            Email = mail;
            CODE = el_code;
        }

        public UserInfo(int userId, int uid, String mail, int el_code) {
            UserId = uid;
            Email = mail;
            ID = userId;
            CODE = el_code;
        }


    }

希望对你有帮助

【讨论】:

  • 所以你的意思是我应该把整数改成字符串还是?
  • 我把它改成了: String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_USERID + " TEXT," + KEY_EMAIL + " TEXT," + KEY_CODE + " TEXT" + ")";
  • 没有创建像 String Code_Key ="Code" 这样的列;并为您的所有代码更改它
  • 我确实这样做了。但它不起作用,它会引发同样的错误。
  • 我的行是:UserInfo info = new UserInfo(Integer.parseInt(userId.getText().toString()), email.getText().toString(), random_code);
猜你喜欢
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
相关资源
最近更新 更多