如何解决如何使用android studio中的两个活动在sqlite数据库中创建两个表
我在 sqlite 数据库 user_data 中创建了两个表 user_table 和 Vehicle_table,我在其中使用两个 .xml 活动接受数据。一个活动页面工作正常,但我用来操作第二个表的页面不起作用。它显示:“应用程序已停止工作”。这里是所有的代码。请帮我找出这里的错误。
package com.example.login;
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;
public class user_data_sql extends sqliteOpenHelper {
public static final String DATABASE_NAME= "user_data1.db";
public static final String TABLE_NAME= "user_table";
public static final String TABLE_NAME2= "vehicle_table";
public static final String COL_1= "USER_ID";
public static final String COL_2= "FirsT_NAME";
public static final String COL_3= "LAST_NAME";
public static final String COL_4= "PHN_NO";
public static final String COL_5= "dob";
public static final String COL_6= "ADHAR_NO";
public static final String COL_7= "LICENSE_NO";
public static final String COL_8= "LICENSE_VALIDITY";
public static final String COLV_1 = "VehicleID";
public static final String COLV_3 = "RCNumber";
public static final String COLV_4 = "RCValidity";
public static final String COLV_5 = "ChassisNumber";
public static final String COLV_6 = "InsuranceNumber";
public static final String COLV_7 = "InsuranceValidity";
public static final String COLV_8 = "PUCValidity";
public user_data_sql(@Nullable Context context) {
super(context,DATABASE_NAME,null,1);
sqliteDatabase db= this.getWritableDatabase();
}
@Override
public void onCreate(sqliteDatabase db) {
db.execsql("create table "+ TABLE_NAME+"(USER_ID INTEGER PRIMARY KEY AUTOINCREMENT,FirsT_NAME TEXT," +
"LAST_NAME TEXT,PHN_NO INT,dob TEXT,ADHAR_NO INT,LICENSE_NO TEXT,LICENSE_VALIDITY INT)");
//recentchanges
db.execsql("create table "+ TABLE_NAME2+"(VehicleID INTEGER PRIMARY KEY AUTOINCREMENT," +
"RCNUMBER TEXT,RCValidity Date,ChassisNumber TEXT,InsuranceNumber INTEGER,InsuranceValidity Date," +
"PUCValidity Date,USER_ID INT,FOREIGN KEY(USER_ID) REFERENCES user_table(USER_ID))");
}
@Override
public void onUpgrade(sqliteDatabase db,int i,int i1) {
db.execsql("DROP TABLE IF EXISTS "+ TABLE_NAME);
db.execsql("DROP TABLE IF EXISTS "+ TABLE_NAME2);
onCreate(db);
}
public boolean insertData(String FirsT_NAME,String LAST_NAME,String PHN_NO,String dob,String ADHAR_NO,String LICENSE_NO,String LICENSE_VALIDITY)
{
sqliteDatabase db= this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_2,FirsT_NAME);
contentValues.put(COL_3,LAST_NAME);
contentValues.put(COL_4,PHN_NO);
contentValues.put(COL_5,dob);
contentValues.put(COL_6,ADHAR_NO);
contentValues.put(COL_7,LICENSE_NO);
contentValues.put(COL_8,LICENSE_VALIDITY);
long result = db.insert(TABLE_NAME,contentValues);
return result != -1;
}
public boolean insertData1(String rcNumber,String rcValidity,String chassisNumber,String insuranceNumber,String insuranceValidity,String pucValidity){
sqliteDatabase db = this.getWritableDatabase();
ContentValues contentValues1 = new ContentValues();
contentValues1.put(COLV_3,rcNumber);
contentValues1.put(COLV_4,rcValidity);
contentValues1.put(COLV_5,chassisNumber);
contentValues1.put(COLV_6,insuranceNumber);
contentValues1.put(COLV_7,insuranceValidity);
contentValues1.put(COLV_8,pucValidity);
long result = db.insert(TABLE_NAME2,contentValues1);
return result != -1;
}
}
page1:qr2.java
package com.example.login;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.journeyapps.barcodescanner.BarcodeEncoder;
public class QR2 extends AppCompatActivity {
user_data_sql myDb;
EditText etFirstName,etLastName,etPhoneNumber,etdob,etAadhar,etLicenseNumber,etLicenseValidity;
Button Generate2,Save,Next;
ImageView output;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_q_r2);
myDb =new user_data_sql(this);
etFirstName=(EditText) findViewById(R.id.etFirstName);
etLastName=(EditText) findViewById(R.id.etLastName);
etPhoneNumber=(EditText) findViewById(R.id.etPhoneNumber);
etdob=(EditText) findViewById(R.id.etdob);
etAadhar=(EditText) findViewById(R.id.etAadhar);
etLicenseNumber=(EditText) findViewById(R.id.etLicenseNumber);
etLicenseValidity=(EditText) findViewById(R.id.etLicenseValidity);
Generate2=(Button) findViewById(R.id.btnGenerate2);
output=(ImageView) findViewById(R.id.Output);
Save=(Button) findViewById(R.id.btnSave);
Next=(Button) findViewById(R.id.btnNext);
AddData();
Generate2.setonClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//get input value from edit text
String data = etFirstName.getText().toString().trim();
MultiFormatWriter writer=new MultiFormatWriter();
try {
BitMatrix matrix=writer.encode(data,BarcodeFormat.QR_CODE,350,350);
//Initialise barcode encoder
BarcodeEncoder encoder=new BarcodeEncoder();
//Initialise bitmap
Bitmap bitmap=encoder.createBitmap(matrix);
//set bitmap to image view
output.setimageBitmap(bitmap);
//initialise input manager
InputMethodManager manager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
//hide soft keyboard
manager.hideSoftInputFromWindow(etFirstName.getapplicationwindowToken(),0);
} catch (WriterException e) {
e.printstacktrace();
}
}
});
Next.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent3 = new Intent(QR2.this,Vehicle_info.class);
startActivity(intent3);
}
});
}
public void AddData()
{
Save.setonClickListener(
new OnClickListener(){
@Override
public void onClick(View v) {
boolean isInserted= myDb.insertData(etFirstName.getText().toString(),etLastName.getText().toString(),etPhoneNumber.getText().toString(),etdob.getText().toString(),etAadhar.getText().toString(),etLicenseNumber.getText().toString(),etLicenseValidity.getText().toString());
if(isInserted)
Toast.makeText(QR2.this,"Data Inserted",Toast.LENGTH_LONG).show();
else
Toast.makeText(QR2.this,"Data NOT Inserted",Toast.LENGTH_LONG).show();
}
}
);
}
}
page2:Vehicle_info.java
package com.example.login;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
public class Vehicle_info extends AppCompatActivity {
user_data_sql myDb;
EditText editrcNumber,editrcValidity,editchassisNumber,editinsuranceNumber,editinsuranceValidity,editpucValidity;
Button btnAddData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_vehicle_info);
myDb = new user_data_sql(this);
editrcNumber = (EditText)findViewById(R.id.etRCNumber);
editrcValidity = (EditText)findViewById(R.id.etRCValidity);
editchassisNumber = (EditText)findViewById(R.id.etChassisNumber);
editinsuranceNumber = (EditText)findViewById(R.id.etInsuranceNumber);
editinsuranceValidity = (EditText)findViewById(R.id.etInsuranceValidity);
editpucValidity = (EditText)findViewById(R.id.etPUCValidity);
btnAddData = (Button)findViewById(R.id.btnSave);
AddData1();
}
public void AddData1()
{
btnAddData.setonClickListener(
new OnClickListener(){
@Override
public void onClick(View v) {
boolean isInserted= myDb.insertData1(editrcNumber.getText().toString(),editrcValidity.getText().toString(),editchassisNumber.getText().toString(),editinsuranceNumber.getText().toString(),editinsuranceValidity.getText().toString(),editpucValidity.getText().toString());
if(isInserted)
Toast.makeText(Vehicle_info.this,Toast.LENGTH_LONG).show();
else
Toast.makeText(Vehicle_info.this,Toast.LENGTH_LONG).show();
}
}
);
}
}
解决方法
如果没有堆栈跟踪“应用程序停止工作”可能有很多原因。
- 您或许应该查看 https://developer.android.com/studio/debug/ 以了解如何在其他调试技术中获取堆栈跟踪。
但是,很可能原因的线索是"//recentchanges"。看起来您可能在运行应用程序后添加了第二个表,但没有正确处理要应用于数据库的更改。
DatabaseHelper 中的 onCreate
方法(即您的 user_data_sql 类)仅在数据库不存在时运行/调用。因此,这可能仅对第一个表运行。
删除和重新创建表的 onUpgrade
方法只会在数据库版本增加时运行。数据库版本是传递给 super 调用的第四个参数。你有:-
super(context,DATABASE_NAME,null,1);
因此,您似乎不允许运行 onUpgrade
方法。
修复 1 将超级调用更改为 :-
super(context,2 /*<<<<<<<<<< INCREASED DATABASE VERSION*/);
- 在包含的第 4 个参数之后添加注释只是为了突出显示对数据库版本号所做的更改。
应该导致调用 onUpgrade 方法,然后该方法应该删除表然后创建它们(丢失任何现有数据),然后您的代码很可能会起作用,或者至少会进一步发展。
- 请注意,通常您会将
onUpgrade
方法中运行的代码限制为仅通过使用/检查旧版本(代码中的第二个参数 i)来引入更改所需的步骤和新版本(代码中的第三个参数或 i1)。
修复 2/3
另一种可能更简单的方法是删除数据库,在这种情况下,Databasehelper 的 onCreate
方法将运行,数据库版本号可以保持为 1。删除数据库的最简单方法是卸载应用程序,然后重新运行应用程序。您还可以删除 data/data/
- 请注意,如最初所述,这只是对您问题的可能原因的猜测。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。