Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android-SQLite向数据库添加更多表的问题_Java_Android_Database_Sqlite_Appsettings - Fatal编程技术网

Java Android-SQLite向数据库添加更多表的问题

Java Android-SQLite向数据库添加更多表的问题,java,android,database,sqlite,appsettings,Java,Android,Database,Sqlite,Appsettings,首先,我创建了我的处方表,这很有效。 然后我尝试向数据库添加第二个表,称为patient_table。 然而,我得到了这个错误“ 我尝试将数据库版本号从1更改为2,但这导致我的应用程序崩溃。我也尝试从android设备上卸载该应用程序,但仍然出现相同的错误 任何帮助都将不胜感激 package com.example.medicationmanagementsystem.DAO; //code below is based on AndroidSQLite Tutorial Android CR

首先,我创建了我的处方表,这很有效。 然后我尝试向数据库添加第二个表,称为patient_table。 然而,我得到了这个错误“

我尝试将数据库版本号从1更改为2,但这导致我的应用程序崩溃。我也尝试从android设备上卸载该应用程序,但仍然出现相同的错误

任何帮助都将不胜感激

package com.example.medicationmanagementsystem.DAO;
//code below is based on AndroidSQLite Tutorial Android CRUD Tutorial with SQLite (Create, Read, Update, Delete), ProgrammingKnowledge, https://www.youtube.com/watch?v=kDZES1wtKUY
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;

public class DatabaseHelper extends SQLiteOpenHelper {

    //Create Database
    public static final String DATABASE_NAME = "ManagementSystem.db";
    //Create patient table
    public static final String TABLE_PATIENT = "patient_table";
    public static final String COL_PATIENT_PATIENTID = "PATID";
    public static final String COL_PATIENT_FNAME = "FNAME";
    public static final String COL_PATIENT_SNAME = "SNAME";
    public static final String COL_PATIENT_PPS = "PPS";
    public static final String COL_PATIENT_DOB = "DOB";
    public static final String COL_PATIENT_ADDRESS = "ADDRESS";
    public static final String COL_PATIENT_TYPE = "PATIENTTYPE";
    public static final String COL_PATIENT_MEDCOND = "PATIENTMEDCON";
    public static final String COL_PATIENT_CARINGID = "CARINGID";

    //Create prescription table
    public static final String TABLE_PRESCRIPTION = "prescription_table";
    public static final String COL_PRESCRIPTION_ID = "PRESCRIPTIONID";
    public static final String COL_PRESCRIPTION__PATIENTID = "PATIENTID";
    public static final String COL_PRESCRIPTION__DATE = "DATE";
    public static final String COL_PRESCRIPTION__DRUGNAME = "DRUGNAME";
    public static final String COL_PRESCRIPTION__CONCENTRATION = "CONCENTRATION";
    public static final String COL_PRESCRIPTION__DOSAGE = "DOSAGE";
    public static final String COL_PRESCRIPTION__PREPARATION = "PREPARATION";
    public static final String COL_PRESCRIPTION__STARTDATE = "STARTDATE";
    public static final String COL_PRESCRIPTION__ENDDATE = "ENDDATE";
    public static final String COL_PRESCRIPTION__DOCTORID = "DOCTORID";



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

    }
    @Override
    public void onCreate (SQLiteDatabase db) {
        String patienttable = "CREATE TABLE " + TABLE_PATIENT + "(PATID INTEGER PRIMARY KEY AUTOINCREMENT, FNAME TEXT, SNAME TEXT, PPS TEXT, DOB TEXT, ADDRESS TEXT, PATIENTTYPE TEXT, PATIENTMEDCON TEXT, CARINGID INTEGER)";
        String prescriptiontable = "CREATE TABLE " + TABLE_PRESCRIPTION + "(PRESCRIPTIONID INTEGER PRIMARY KEY AUTOINCREMENT, PATIENTID INTEGER, DATE TEXT, DRUGNAME TEXT, CONCENTRATION TEXT, DOSAGE TEXT, PREPARATION TEXT, STARTDATE TEXT, ENDDATE TEXT, DOCTORID INTEGER)";
        db.execSQL(patienttable);
        db.execSQL(prescriptiontable);
        this.getReadableDatabase();
        this.getWritableDatabase();
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS "+ TABLE_PATIENT);
        db.execSQL("DROP TABLE IF EXISTS "+ TABLE_PRESCRIPTION);
        onCreate(db);
    }
    //insert patient data
    public boolean insertPatientData(String fname, String sname, String pps, String dob, String address, String patienttype, String patientmedcon, String caringid) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues1 = new ContentValues();
        contentValues1.put(COL_PATIENT_FNAME, fname);
        contentValues1.put(COL_PATIENT_SNAME, sname);
        contentValues1.put(COL_PATIENT_PPS, pps);
        contentValues1.put(COL_PATIENT_DOB, dob);
        contentValues1.put(COL_PATIENT_ADDRESS, address);
        contentValues1.put(COL_PATIENT_TYPE, patienttype);
        contentValues1.put(COL_PATIENT_MEDCOND,patientmedcon);
        contentValues1.put(COL_PATIENT_CARINGID, caringid);
        long result= db.insert(TABLE_PATIENT,null, contentValues1);
        if (result == 1)
            return false;
        else
            return true;
    }
    //insert prescription data
    public boolean insertData(String patientid, String date, String drugname, String concentration,String dosage, String preparation, String startdate, String enddate, String doctorid) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues2 = new ContentValues();
        contentValues2.put(COL_PRESCRIPTION__PATIENTID, patientid);
        contentValues2.put(COL_PRESCRIPTION__DATE, date);
        contentValues2.put(COL_PRESCRIPTION__DRUGNAME, drugname);
        contentValues2.put(COL_PRESCRIPTION__CONCENTRATION, concentration);
        contentValues2.put(COL_PRESCRIPTION__DOSAGE, dosage);
        contentValues2.put(COL_PRESCRIPTION__PREPARATION, preparation);
        contentValues2.put(COL_PRESCRIPTION__STARTDATE, startdate);
        contentValues2.put(COL_PRESCRIPTION__ENDDATE, enddate);
        contentValues2.put(COL_PRESCRIPTION__DOCTORID, doctorid);
        long result= db.insert(TABLE_PRESCRIPTION,null, contentValues2);
        if (result == 1)
            return false;
        else
            return true;
        //END

    }

    //Coding with mitch tutorial
    public Cursor getListContents() {
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor data = db.rawQuery("SELECT * FROM " + TABLE_PRESCRIPTION, null);
        return data;
    }
}

您不应该尝试在onCreate方法中打开数据库(使用this.getReadableDatabase或this.getWritableDatabase),因为在此阶段getWritableDatabase正在进行中,因此您将得到一个java.lang.IllegalStateException:getDatabase递归调用

也就是说,当您获得DatabaseHelper的实例时,数据库不会被创建或打开。直到您(隐式地(例如通过插入)或显式地)调用getWritableDatabase试图打开数据库并创建它(如果它不存在)。因此调用get???ableDatabase将是一个递归,因为它已经获取了数据库

我尝试将数据库版本号从1更改为2,但是 使我的应用程序崩溃

由于在获取数据库时也会调用onUpgrade,因此调用onCreate也会因为递归而失败

因此,将onCreate方法更改为:-

@Override
public void onCreate (SQLiteDatabase db) {
    String patienttable = "CREATE TABLE " + TABLE_PATIENT + "(PATID INTEGER PRIMARY KEY AUTOINCREMENT, FNAME TEXT, SNAME TEXT, PPS TEXT, DOB TEXT, ADDRESS TEXT, PATIENTTYPE TEXT, PATIENTMEDCON TEXT, CARINGID INTEGER)";
    String prescriptiontable = "CREATE TABLE " + TABLE_PRESCRIPTION + "(PRESCRIPTIONID INTEGER PRIMARY KEY AUTOINCREMENT, PATIENTID INTEGER, DATE TEXT, DRUGNAME TEXT, CONCENTRATION TEXT, DOSAGE TEXT, PREPARATION TEXT, STARTDATE TEXT, ENDDATE TEXT, DOCTORID INTEGER)";
    db.execSQL(patienttable);
    db.execSQL(prescriptiontable);
    //this.getReadableDatabase(); //<<<<< MUST NOT BE USED In onCreate
    //this.getWritableDatabase(); //<<<<< MUST NOT BE USED in onCreate
}
您使用的:-

return (db.insert(......) > 0);

  • -1表示未插入任何行)
测试 以上内容已使用数据库助手进行了测试,并成功插入了行

测试使用了活动中的以下代码:-

public class MainActivity extends AppCompatActivity {

    DatabaseHelper mDBHlpr;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDBHlpr = new DatabaseHelper(this);
        mDBHlpr.insertData("1234567890","2018-01-01","X","50","4 times daily","Shake","2018-01-01","2018-03-01","DOC001");
        mDBHlpr.insertPatientData("Fred","Bloggs","pps001","1974-01-01","1 Somewhere Street","X","MECON001","001");

        Cursor csr = mDBHlpr.getListContents();
        while (csr.moveToNext()) {
            Log.d("SCRIPTINFO","ID is " +csr.getString(csr.getColumnIndex(DatabaseHelper.COL_PRESCRIPTION_ID)));
        }

        csr = mDBHlpr.getWritableDatabase().query(DatabaseHelper.TABLE_PATIENT,null,null,null,null,null,null);
        while (csr.moveToNext()) {
            Log.d("PATIENTINFO","Patient Name is " + csr.getString(csr.getColumnIndex(DatabaseHelper.COL_PATIENT_FNAME)));
        }
        
    }
}
结果(来自卸载应用程序后的首次运行)为:-


您必须从设备上卸载应用程序,以便删除数据库,然后重新运行以重新创建数据库和表,因为onCreate()不是每次运行应用程序时都会调用DatabaseHelper的方法,但只有在没有数据库且需要创建数据库时才会调用。您好,我尝试了此操作,但仍然收到相同的错误。卸载应用程序后,您的处方表是否也会收到相同的错误?您在哪个设备中遇到此问题?模拟器还是真实设备?如果是真实的,则是什么不,这只是发生在病人桌上。处方桌读写都很好。
return (db.insert(......) > 0);
return (db.insert(......) != -1)
public class MainActivity extends AppCompatActivity {

    DatabaseHelper mDBHlpr;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDBHlpr = new DatabaseHelper(this);
        mDBHlpr.insertData("1234567890","2018-01-01","X","50","4 times daily","Shake","2018-01-01","2018-03-01","DOC001");
        mDBHlpr.insertPatientData("Fred","Bloggs","pps001","1974-01-01","1 Somewhere Street","X","MECON001","001");

        Cursor csr = mDBHlpr.getListContents();
        while (csr.moveToNext()) {
            Log.d("SCRIPTINFO","ID is " +csr.getString(csr.getColumnIndex(DatabaseHelper.COL_PRESCRIPTION_ID)));
        }

        csr = mDBHlpr.getWritableDatabase().query(DatabaseHelper.TABLE_PATIENT,null,null,null,null,null,null);
        while (csr.moveToNext()) {
            Log.d("PATIENTINFO","Patient Name is " + csr.getString(csr.getColumnIndex(DatabaseHelper.COL_PATIENT_FNAME)));
        }
        
    }
}
2019-11-18 12:57:10.362 D/SCRIPTINFO: ID is 1
2019-11-18 12:57:10.363 D/PATIENTINFO: Patient Name isFred