【问题标题】:SQLiteDatabase: Android studio custom auto incrementationSQLiteDatabase:Android Studio 自定义自动增量
【发布时间】:2017-03-18 23:47:48
【问题描述】:

我对 Android Studio 和 SQLiteDatabases 非常陌生。我需要以下帮助:

数据库,成功创建并可以显示值。但是,我正在尝试在创建时为每个患者创建一个自定义唯一 ID。 ID 应介于 000000-999999(6 位唯一 ID)之间。

应用的工作方式是:

1. User can "add patient"
2. User enters firstName and lastName
3. User than selects a department from a spinner
4. once the user has completed the above steps, he/she can click "Add Patient"
5. Then the values are displayed in a TabbedView, however the textView is horizontal rather than vertical.
6. and its displayed in a ListView

我已经能够完成上述所有步骤。我现在需要帮助来为患者创建一个唯一的 ID。任何帮助将不胜感激

请看下面的代码:

PatientDbHelper.java // Creates the tables and database

package tanav.sharma;

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

/**
 * Created by Tanav on 11/4/2016.
 */
public class PatientDbHelper extends SQLiteOpenHelper {


    private static final String DATABASE_NAME = "PATIENTINFO.db";
    private static final int DATABASE_VERSION = 1;

    private static final String CREATE_QUERY =
            "CREATE TABLE "+PatientInfo.NewPatientInfo.TABLE_NAME+" ("+ PatientInfo.NewPatientInfo.PATIENT_FNAME+ " TEXT,"+PatientInfo.NewPatientInfo.PATIENT_LNAME+" TEXT,"+PatientInfo.NewPatientInfo.PATIENT_DEPARTMENT+" TEXT);";

    public PatientDbHelper(Context context){

        super(context,DATABASE_NAME,null,DATABASE_VERSION);
        Log.e("DATABASE OPERATIONS","Database created / opened ...");
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_QUERY);
        Log.e("DATABASE OPERATIONS","Table created...");

    }

    public void addInformations(String fname, String lname, String department, SQLiteDatabase db){

        ContentValues contentValues = new ContentValues();
        contentValues.put(PatientInfo.NewPatientInfo.PATIENT_FNAME,fname);
        contentValues.put(PatientInfo.NewPatientInfo.PATIENT_LNAME,lname);
        contentValues.put(PatientInfo.NewPatientInfo.PATIENT_DEPARTMENT,department);

        db.insert(PatientInfo.NewPatientInfo.TABLE_NAME, null,contentValues);

        Log.e("DATABASE OPERATIONS","One in row inserted...");
    }

    public Cursor getInformations(SQLiteDatabase db){
        Cursor cursor;
        String[] projections = {PatientInfo.NewPatientInfo.PATIENT_FNAME, PatientInfo.NewPatientInfo.PATIENT_LNAME, PatientInfo.NewPatientInfo.PATIENT_DEPARTMENT};
        cursor = db.query(PatientInfo.NewPatientInfo.TABLE_NAME,projections,null,null,null,null,null);
        return cursor;
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

PatientInfo.java // 这是列名等等。

package tanav.sharma;

/**
 * Created by Tanav on 11/4/2016.
 */
public class PatientInfo {

    public static abstract class NewPatientInfo{

        //public static final String PATIENT_ID = "patient_id";
        public static final String PATIENT_FNAME = "patient_fname";
        public static final String PATIENT_LNAME = "patient_lname";
        public static final String PATIENT_DEPARTMENT = "patient_department";

        public static final String TABLE_NAME = "patient_info";
    }
}

PatientInfoProvider.java

 package tanav.sharma;

    /**
     * Created by Tanav on 11/4/2016.
     */

public class PatientInfoProvider  {

        private String fname;
        private String lname;
        private String departments;

        public PatientInfoProvider(String fname, String lname, String departments){

            this.fname = fname;
            this.lname = lname;
            this.departments = departments;
        }

        public String getLname() {
            return lname;
        }

        public void setLname(String lname) {
            this.lname = lname;
        }

        public String getDepartments() {
            return departments;
        }

        public void setDepartments(String departments) {
            this.departments = departments;
        }

        public String getFname() {
            return fname;
        }

        public void setFname(String fname) {
            this.fname = fname;
        }
    }

下面的文件是用 customText 视图在 listView 中显示值。

PatientAdapter.java

package tanav.sharma;

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 java.util.ArrayList;
import java.util.List;

/**
 * Created by Tanav on 11/4/2016.
 */
public class PatientAdapter extends ArrayAdapter {

    List list = new ArrayList();


    public PatientAdapter(Context context, int resource) {
        super(context, resource);
    }

    static class LayoutHandler{
        TextView FNAME,LNAME,Department;
    }

    @Override
    public void add(Object object) {
        super.add(object);
        list.add(object);
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        LayoutHandler layoutHandler;
        if(row == null){
            LayoutInflater layoutInflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = layoutInflater.inflate(R.layout.display_all_patients,parent,false);

            layoutHandler = new LayoutHandler();
            layoutHandler.FNAME = (TextView)row.findViewById(R.id.patientNameFirst);
            layoutHandler.LNAME = (TextView)row.findViewById(R.id.patientNameLast);
            layoutHandler.Department = (TextView) row.findViewById(R.id.patientDepartment);

            row.setTag(layoutHandler);

        }else{
            layoutHandler = (LayoutHandler)row.getTag();

        }

        PatientInfoProvider patientInfoProvider = (PatientInfoProvider)this.getItem(position);
        layoutHandler.FNAME.setText(patientInfoProvider.getFname());
        layoutHandler.LNAME.setText(patientInfoProvider.getLname());
        layoutHandler.Department.setText(patientInfoProvider.getDepartments());

        return row;
    }
}

【问题讨论】:

  • developer.android.com/reference/android/provider/…。检查_ID。您可以使用BaseColumns._ID 并使其成为INTEGER NOT NULL PRIMARY KEY
  • 我会把这个放在哪里?在我的 PatientDbHelper 中?
  • 是的"CREATE TABLE "+PatientInfo.NewPatientInfo.TABLE_NAME+" (" + BaseColumns._ID + " INTEGER NOT NULL PRIMARY KEY,"......
  • 好的,已经成功了。有什么方法可以私信你吗?我还有更多问题
  • 您可以在 stackoverflow 上加入聊天室。但是有一些规则需要遵守。你需要问一个新问题

标签: java android sql sqlite android-studio


【解决方案1】:

AUTOINCREMENT 的目的是防止重复使用以前删除的行的 ID。

PatientInfo.java ID 列必须是表格的第一列:

public static final String PATIENT_ID = "_id";

PatientDbHelper.java

private static final String CREATE_QUERY = "CREATE TABLE " + PatientInfo.NewPatientInfo.TABLE_NAME + " ("
+ PatientInfo.NewPatientInfo.PATIENT_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ PatientInfo.NewPatientInfo.PATIENT_FNAME+ " TEXT,"
+ PatientInfo.NewPatientInfo.PATIENT_LNAME+" TEXT,"
+ PatientInfo.NewPatientInfo.PATIENT_DEPARTMENT+" TEXT);";

在 addInformations() 中

if ( id != 0 ) contentValues.put(PatientInfo.NewPatientInfo.PATIENT_ID,id);

PatientInfoProvider.java

private int id;

public void setId(int id) {
        this.id= id;
    }

或/和更改构造函数

public PatientInfoProvider(int id, String fname, String lname, String departments){
this.id = id;
this.fname = fname;
this.lname = lname;
this.departments = departments; }

您必须在某处填写 ID 字段。如果您需要,我可以放置整个 PatientInfoProvider.java

好的,那么我的 addInformation() 会像这样吗?

public void addInformations(int id, String fname, String lname, String department, SQLiteDatabase db){

        ContentValues contentValues = new ContentValues();
        if ( id != 0 ) contentValues.put(PatientInfo.NewPatientInfo.PATIENT_ID, id);
        contentValues.put(PatientInfo.NewPatientInfo.PATIENT_FNAME,fname);
        contentValues.put(PatientInfo.NewPatientInfo.PATIENT_LNAME,lname);
        contentValues.put(PatientInfo.NewPatientInfo.PATIENT_DEPARTMENT,department);


        db.insert(PatientInfo.NewPatientInfo.TABLE_NAME, null,contentValues);

        Log.e("DATABASE OPERATIONS","One in row inserted...");
    }

它还给我以下错误:

Error:(50, 28) error: method addInformations in class PatientDbHelper cannot be applied to given types;
required: int,String,String,String,SQLiteDatabase
found: String,String,String,SQLiteDatabase
reason: actual and formal argument lists differ in length

所以我尝试通过在我的代码中应用以下几行来修复它。

public void addPatient(View view){

    int id; // Added this line
    String fname = PatientFirstName.getText().toString();
    String lname = PatientLastName.getText().toString();
    String dept = departments.getSelectedItem().toString();

    patientDbHelper = new PatientDbHelper(this);
    sqLiteDatabase = patientDbHelper.getWritableDatabase();
    patientDbHelper.addInformations(id,fname,lname,dept,sqLiteDatabase); //added 'id' in arguments..
    Toast.makeText(getBaseContext(),"Data Saved",Toast.LENGTH_LONG).show();
    patientDbHelper.close();

}

但是,addInformations 中的“id”参数带有红色下划线,表示变量可能尚未初始化。

我已经解决了所有问题:)

【讨论】:

  • 可以吗?我真的需要帮助,我已经 4 天没有休息了
  • 我需要另外 2 个文件来确定。 addInformations() 方法在某处被调用。有一个创建新唯一 ID 的最佳位置。在创建新的唯一 ID 之前,您需要知道当前的最大 ID。我也需要这个文件来帮助你。否则,你可以把你的整个项目发给我。
  • > 但是,addInformations 中的 'id' 参数带有红色下划线,表示变量可能尚未初始化
  • 是的,你需要初始化变量“id”。
  • 大声笑,我终于想通了。非常感谢您的帮助
【解决方案2】:

1-通过java中的Random()类生成随机数。
2-在数据库中搜索该号码是否存在,如果不存在则使用该号码插入数据,则生成新号码。

注意:ID 字段是主要字段,但不是自动增量

【讨论】:

    猜你喜欢
    • 2014-08-07
    • 2019-06-06
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多