Я столкнулся с проблемой и не могу решить.Я все искал и пробовал, но все равно не могу это исправить.
Я создал два отдельных класса, и оба используют одну и ту же базу данных DGWallet.db
Первый класс - DatabaseHelper.java
package com.example.dell.sql;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import com.example.dell.model.User;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ArrayList;
import java.util.List;
public class DatabaseHelper extends SQLiteOpenHelper {
// Database Version
private static final int DATABASE_VERSION = 3;
// Database Name
private static final String DATABASE_NAME = "DGWallet.db";
// User table name
private static final String TABLE_USER = "users";
// User Table Columns names
private static final String COLUMN_NAME = "name";
private static final String COLUMN_BIRTH_DATE = "date";
private static final String COLUMN_EMAIL = "email";
private static final String COLUMN_PASSWORD = "password";
private static final String COLUMN_PHONE = "phone_no";
// create table sql query
private String CREATE_USER_TABLE = "CREATE TABLE " + TABLE_USER + "("
+ COLUMN_PHONE + " INTEGER PRIMARY KEY ," + COLUMN_NAME + " TEXT," + COLUMN_BIRTH_DATE + " DATE, "
+ COLUMN_EMAIL + " TEXT," + COLUMN_PASSWORD + " TEXT" + ")";
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
/**
* Constructor
*
* @param context
*/
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_USER_TABLE);
}
/**
* This method is to create user record
*
* @param user
*/
public void addUser(User user) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_PHONE, user.getPhone());
values.put(COLUMN_NAME, user.getName());
values.put(COLUMN_BIRTH_DATE, user.getBirthDate());
values.put(COLUMN_EMAIL, user.getEmail());
values.put(COLUMN_PASSWORD, user.getPassword());
// Inserting Row
db.insert(TABLE_USER, null, values);
db.close();
}
/**
* This method is to fetch all user and return the list of user records
*
* @return list
*/
public List<User> getAllUser() {
// array of columns to fetch
String[] columns = {
COLUMN_PHONE,
COLUMN_NAME,
COLUMN_BIRTH_DATE,
COLUMN_EMAIL,
COLUMN_PASSWORD
};
// sorting orders
String sortOrder =
COLUMN_NAME + " ASC";
List<User> userList = new ArrayList<User>();
SQLiteDatabase db = this.getReadableDatabase();
// query the user table
/**
* Here query function is used to fetch records from user table this function works like we use sql query.
* SQL query equivalent to this query function is
* SELECT user_id,user_name,user_email,user_password FROM user ORDER BY user_name;
*/
Cursor cursor = db.query(TABLE_USER, //Table to query
columns, //columns to return
null, //columns for the WHERE clause
null, //The values for the WHERE clause
null, //group the rows
null, //filter by row groups
sortOrder); //The sort order
// Traversing through all rows and adding to list
if (cursor.moveToFirst()) {
do {
User user = new User();
user.setPhone(Integer.parseInt(cursor.getString(cursor.getColumnIndex(COLUMN_PHONE))));
user.setName(cursor.getString(cursor.getColumnIndex(COLUMN_NAME)));
user.setBirthDate(cursor.getString(cursor.getColumnIndex(COLUMN_BIRTH_DATE)));
user.setEmail(cursor.getString(cursor.getColumnIndex(COLUMN_EMAIL)));
user.setPassword(cursor.getString(cursor.getColumnIndex(COLUMN_PASSWORD)));
// Adding user record to list
userList.add(user);
} while (cursor.moveToNext());
}
cursor.close();
db.close();
// return user list
return userList;
}
/**
* This method to check user exist or not
*
* @param email
* @return true/false
*/
public boolean checkUser(String email) {
// array of columns to fetch
String[] columns = {
COLUMN_NAME
};
SQLiteDatabase db = this.getReadableDatabase();
// selection criteria
String selection = COLUMN_EMAIL + " = ?";
// selection argument
String[] selectionArgs = {email};
// query user table with condition
/**
* Here query function is used to fetch records from user table this function works like we use sql query.
* SQL query equivalent to this query function is
* SELECT user_id FROM user WHERE user_email = 'jack@androidtutorialshub.com';
*/
Cursor cursor = db.query(TABLE_USER, //Table to query
columns, //columns to return
selection, //columns for the WHERE clause
selectionArgs, //The values for the WHERE clause
null, //group the rows
null, //filter by row groups
null); //The sort order
int cursorCount = cursor.getCount();
cursor.close();
db.close();
if (cursorCount > 0) {
return true;
}
return false;
}
/**
* This method to check user exist or not
*
* @param email
* @param password
* @return true/false
*/
public boolean checkUser(String email, String password) {
// array of columns to fetch
String[] columns = {
COLUMN_NAME
};
SQLiteDatabase db = this.getReadableDatabase();
// selection criteria
String selection = COLUMN_EMAIL + " = ?" + " AND " + COLUMN_PASSWORD + " = ?";
// selection arguments
String[] selectionArgs = {email, password};
// query user table with conditions
/**
* Here query function is used to fetch records from user table this function works like we use sql query.
* SQL query equivalent to this query function is
* SELECT user_id FROM user WHERE user_email = 'jack@androidtutorialshub.com' AND user_password = 'qwerty';
*/
Cursor cursor = db.query(TABLE_USER, //Table to query
columns, //columns to return
selection, //columns for the WHERE clause
selectionArgs, //The values for the WHERE clause
null, //group the rows
null, //filter by row groups
null); //The sort order
int cursorCount = cursor.getCount();
cursor.close();
db.close();
if (cursorCount > 0) {
return true;
}
return false;
}
}
Из этого класса создается таблица, которую я проверил в оболочке adb:
sqlite3 DG <
DGWallet.db DGWallet.db-shm DGWallet.db-wal
qlite3 DGWallet.db <
SQLite version 3.22.0 2018-01-22 18:45:57
Enter ".help" for usage hints.
sqlite> .table
android_metadata users
sqlite> select * from users;
Однако, когда я использую аналогичный тип кода, для создания другой таблицы я получаюсообщение об ошибке.Кроме того, код создания таблицы не выполняется.Я проверил это, удалив запятую, и все же он не выдал никакой ошибки.
package com.example.dell.sql;
import android.content.Context;
import android.database.sqlite.SQLiteOpenHelper;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.ContactsContract;
import com.example.dell.model.Add_User;
import java.util.ArrayList;
import java.util.List;
public class DatabasePersonDetails extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 3;
public static final String DATABASE_NAME = "DGWallet.db";
private static final String TABLE_USERS = "persondetails";
public static final String COLUMN_FIRST_NAME = "firstname";
public static final String COLUMN_MIDDLE_NAME = "middlename";
public static final String COLUMN_LAST_NAME = "lastname";
public static final String COLUMN_ADDRESS = "address";
public static final String COLUMN_PHONE = "phone";
public static final String COLUMN_CREDIT_BALANCE = "credit_balance";
public static final String COLUMN_DEBIT_BALANCE = "debit_balace";
private static final String CREATE_USER_TABLE =
"CREATE TABLE " + DatabasePersonDetails.TABLE_USERS + " (" +
COLUMN_PHONE + " INTEGER PRIMARY KEY," +
COLUMN_FIRST_NAME + " TEXT," +
COLUMN_MIDDLE_NAME + " TEXT," +
COLUMN_LAST_NAME + "Text," +
COLUMN_ADDRESS + "Text," +
COLUMN_CREDIT_BALANCE + "Real," +
COLUMN_DEBIT_BALANCE + "Real" + ")";
public DatabasePersonDetails(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_USER_TABLE);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// This database is only a cache for online data, so its upgrade policy is
// to simply to discard the data and start over
db.execSQL(CREATE_USER_TABLE);
onCreate(db);
}
public void add_user(Add_User add_user){
// Gets the data repository in write mode
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_PHONE, add_user.getPhone());
values.put(COLUMN_FIRST_NAME, add_user.getFirstname());
values.put(COLUMN_MIDDLE_NAME,add_user.getMiddlename());
values.put(COLUMN_LAST_NAME,add_user.getLastname());
values.put(COLUMN_ADDRESS,add_user.getAddress());
values.put(COLUMN_CREDIT_BALANCE,add_user.getCredit_bal());
values.put(COLUMN_DEBIT_BALANCE,add_user.getDebit_bal());
db.insert(TABLE_USERS, null,values);
db.close();
}
public List<Add_User> getAllUsers(){
String [] columns = {
COLUMN_PHONE,
COLUMN_FIRST_NAME,
COLUMN_MIDDLE_NAME,
COLUMN_LAST_NAME,
COLUMN_ADDRESS,
COLUMN_CREDIT_BALANCE,
COLUMN_DEBIT_BALANCE
};
String sortOrder = COLUMN_FIRST_NAME + "ASC";
List<Add_User> add_userList=new ArrayList<Add_User>();
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_USERS, //Table to query
columns, //columns to return
null, //columns for the WHERE clause
null, //The values for the WHERE clause
null, //group the rows
null, //filter by row groups
sortOrder); //The sort order
if (cursor.moveToFirst()) {
do {
Add_User addUser = new Add_User();
addUser.setPhone(Long.parseLong(cursor.getString(cursor.getColumnIndex(COLUMN_PHONE))));
addUser.setFirstname(cursor.getString(cursor.getColumnIndex(COLUMN_FIRST_NAME)));
addUser.setMiddlename(cursor.getString(cursor.getColumnIndex(COLUMN_MIDDLE_NAME)));
addUser.setLastname(cursor.getString(cursor.getColumnIndex(COLUMN_LAST_NAME)));
addUser.setAddress(cursor.getString(cursor.getColumnIndex(COLUMN_ADDRESS)));
addUser.setCredit_bal(Float.parseFloat(cursor.getString(cursor.getColumnIndex(COLUMN_CREDIT_BALANCE))));
addUser.setDebit_bal(Float.parseFloat(cursor.getString(cursor.getColumnIndex(COLUMN_DEBIT_BALANCE))));
;
// Adding user record to list
add_userList.add(addUser);
} while (cursor.moveToNext());
}
cursor.close();
db.close();
// return user list
return add_userList;
}
}
Я попытался изменить номер версии с 3 на 4, и я также проверил номер версии, который имеет эмулятор.
3.22.0 2018-01-22 18:45:57 0c55d179733b46d8d0ba4d88e01a25e10677046ee3da1d5b1581e86726f2alt2
Я удалил приложение из эмулятора, очистил проект и снова проверил, но проблема остается.
Это сообщение об ошибке:
E/SQLiteDatabase: Error inserting firstname=null address=xyz debit_balace=5000.0 phone=7022013810 credit_balance=5000.0 middlename=Rao lastname=Lambu
android.database.sqlite.SQLiteException: no such table: persondetails (code 1 SQLITE_ERROR): , while compiling: INSERT INTO persondetails(firstname,address,debit_balace,phone,credit_balance,middlename,lastname) VALUES (?,?,?,?,?,?,?)
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:901)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:512)
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:1562)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1433)
at com.example.dell.sql.DatabasePersonDetails.add_user(DatabasePersonDetails.java:74)
at com.example.dell.digitalwallet.Add_Users.PostDataToSqlite(Add_Users.java:118)
at com.example.dell.digitalwallet.Add_Users$1.onClick(Add_Users.java:95)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25881)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6649)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826)
Add_User.java
public class Add_User {
private String firstname;
private String middlename;
private String lastname;
private String address;
private long Phone_No;
private float Credit_bal;
private float Debit_bal;
// private String birth_date;
public String getFirstname() {return firstname;}
public void setFirstname(String firstname) {
this.firstname =firstname;
}
public String getMiddlename() {return middlename;}
public void setMiddlename(String middlename){
this.middlename=middlename;
}
public String getLastname() {return lastname;}
public void setLastname(String lastname) {
this.lastname=lastname;
}
public String getAddress() {return address;}
public void setAddress(String address){
this.address=address;
}
public long getPhone() {
return Phone_No;
}
public void setPhone(long Phone_no) {
this.Phone_No = Phone_no;
}
public float getCredit_bal(){return Credit_bal;}
public void setCredit_bal(float Credit_bal){
this.Credit_bal=Credit_bal;
}
public float getDebit_bal(){return Debit_bal;}
public void setDebit_bal(float Debit_bal){
this.Debit_bal=Debit_bal;
}
}
Может кто-нибудь помочь мне с этим.Спасибо.