Помогите с решением, я добавил новый столбец в таблицу SQL. Но в логах выводится ошибка такого рода:
04-08 23: 46: 27.498 18193-18193 / com.shihzamanapp.com E / SQLiteLog: (1)
таблица tbl_order не имеет столбца с именем Menu_quantity
04-08 23: 46: 27.498 18193-18193 / com.shihzamanapp.com E / SQLiteDatabase:
Ошибка при вставке Menu_quantity = 62452999 Имя_меню = Сэндвичи с Овощями
Total_price = 30,0 id = 139 Количество = 3
android.database.sqlite.SQLiteException: таблица tbl_order не имеет столбца
с именем Menu_quantity (код 1): при компиляции: INSERT INTO tbl_order
(Menu_quantity, Menu_name, Total_price, id, Number) VALUES (?,?,?,?,?)
################################################## ###############
Код ошибки: 1 (SQLITE_ERROR) Причина: ошибка SQL (запроса) или отсутствие
базы
данных.(таблица tbl_order не имеет столбца с именем Menu_quantity (код 1):
при
компиляции: INSERT INTO tbl_order (Menu_quantity, Menu_name, Total_price,
id,
Number) VALUES (?,?,?,?,?))
################################################## ###############
на android.database.sqlite.SQLiteConnection.nativePrepareStatement
(собственный метод)
на android.database.sqlite.SQLiteConnection.acquirePreparedStatement
(SQLiteConnection.java:1093)
на android.database.sqlite.SQLiteConnection.prepare
(SQLiteConnection.java:670)
на android.database.sqlite.SQLiteSession.prepare
(SQLiteSession.java:588)
на android.database.sqlite.SQLiteProgram. <init>
(SQLiteProgram.java:59)
на android.database.sqlite.SQLiteStatement. <init>
(SQLiteStatement.java:31)
в android.database.sqlite.SQLiteDatabase.insertWithOnConflict
(SQLiteDatabase.java:1607)
в android.database.sqlite.SQLiteDatabase.insert
(SQLiteDatabase.java:1479)
в com.panda.shop.DBHelper.addData
(DBHelper.java:220)
в com.panda.shop.ActivityMenuDetail $ 2.onClick
(ActivityMenuDetail.java:194)
в com.android.internal.app.AlertController $ ButtonHandler.handleMessage
(AlertController.java:166)
на android.os.Handler.dispatchMessage (Handler.java:102)
на android.os.Looper.loop (Looper.java:135)
на android.app.ActivityThread.main (ActivityThread.java:5910)
в java.lang.reflect.Method.invoke (родной метод)
в java.lang.reflect.Method.invoke (Method.java:372)
на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run
(ZygoteInit.java:1405)
на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1200)
04-08 23: 46: 27.518 18193-18193 / com.shihzamanapp.com E / ViewRootImpl:
sendUserActionEvent () mView == null
Эти классы подсвечены в логах:
в com.panda.shop.DBHelper.addData(DBHelper.java:220)
в com.panda.shop.ActivityMenuDetail $ 2.onClick(ActivityMenuDetail.java:194)
При клике в логе на этот класс:
в com.panda.shop.DBHelper.addData(DBHelper.java:220)
Перенаправляет на этот метод :
// попросите объект базы данных вставить новые данные
try{db.insert(TABLE_NAME, null, values);}
catch(Exception e)
{Log.e("DB ERROR", e.toString());
e.printStackTrace();}}
При клике в логе на этот класс:
в com.panda.shop.ActivityMenuDetail $ 2.onClick(ActivityMenuDetail.java:194)
Перенаправляет на этот метод :
dbhelper.addData(Menu_ID, Menu_name, quantity (Menu_price*quantity),Menu_quantity);
Вот мой DBHelper ,в нём я добавил private final String CONTACT_NUMBER_COL = " Menu_quantity ";
:
public class DBHelper extends SQLiteOpenHelper{
String DB_PATH;
private final static String DB_NAME = "db_order";
public final static int DB_VERSION = 10;
public static SQLiteDatabase db;
private final Context context;
private final String TABLE_NAME = " tbl_order ";
private final String ID = "id";
private final String MENU_NAME = " Menu_name ";
private final String QUANTITY = " Quantity ";
private final String TOTAL_PRICE = " Total_price ";
private final String CONTACT_NUMBER_COL = " Menu_quantity ";
public DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
this.context = context;
DB_PATH = Constant.DBPath;
DB_PATH = Constant2.DBPath;
DB_PATH = Constant3.DBPath;
}
public void createDataBase() throws IOException{
boolean dbExist = checkDataBase();
SQLiteDatabase db_Read = null;
if(dbExist){
//ничего не делать - база данных уже существует
}else{
db_Read = this.getReadableDatabase();
db_Read.close();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
private boolean checkDataBase(){
File dbFile = new File(DB_PATH + DB_NAME);
return dbFile.exists();
}
private void copyDataBase() throws IOException{
InputStream myInput = context.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
}
public void openDataBase() throws SQLException{
String myPath = DB_PATH + DB_NAME;
db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
}
@Override
public void close() {
db.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
/** этот код используется для получения всех данных из базы данных */
public ArrayList<ArrayList<Object>> getAllData(){
ArrayList<ArrayList<Object>> dataArrays = new ArrayList<ArrayList<Object>>();
Cursor cursor = null;
try{
cursor = db.query(
TABLE_NAME,
new String[]{ID, MENU_NAME, QUANTITY, TOTAL_PRICE, CONTACT_NUMBER_COL },
null,null, null, null, null, null);
cursor.moveToFirst();
if (!cursor.isAfterLast()){
do{
ArrayList<Object> dataList = new ArrayList<Object>();
dataList.add(cursor.getLong(0));
dataList.add(cursor.getString(1));
dataList.add(cursor.getString(2));
dataList.add(cursor.getString(3));
dataList.add(cursor.getString(4));
dataArrays.add(dataList);
}
while (cursor.moveToNext());
}
cursor.close();
}catch (SQLException e){
Log.e("DB Error", e.toString());
e.printStackTrace();
}
return dataArrays;
}
/** этот код используется для получения всех данных из базы данных */
public boolean isDataExist(long id){
boolean exist = false;
Cursor cursor = null;
try{
cursor = db.query(
TABLE_NAME,
new String[]{ID},
ID +"="+id,
null, null, null, null, null);
if(cursor.getCount() > 0){
exist = true;
}
cursor.close();
}catch (SQLException e){
Log.e("DB Error", e.toString());
e.printStackTrace();
}
return exist;
}
/** этот код используется для получения всех данных из базы данных */
public boolean isPreviousDataExist(){
boolean exist = false;
Cursor cursor = null;
try{
cursor = db.query(
TABLE_NAME,
new String[]{ID},
null,null, null, null, null, null);
if(cursor.getCount() > 0){
exist = true;
}
cursor.close();
}catch (SQLException e){
Log.e("DB Error", e.toString());
e.printStackTrace();
}
return exist;
}
public void addData(long id, String menu_name,int quantity, double total_price, int menu_quantity){
// это ключевой держатель пары значений, используемый функциями SQLite для Android
ContentValues values = new ContentValues();
values.put(ID, id);
values.put(MENU_NAME, menu_name);
values.put(QUANTITY, quantity);
values.put(TOTAL_PRICE, total_price);
values.put(CONTACT_NUMBER_COL, menu_quantity);
// попросите объект базы данных вставить новые данные
try{db.insert(TABLE_NAME, null, values);}
catch(Exception e)
{
Log.e("DB ERROR", e.toString());
e.printStackTrace();
}
}
public void deleteData(long id){
// попросите менеджера баз данных удалить строку данного идентификатора
try {db.delete(TABLE_NAME, ID + "=" + id, null);}
catch (Exception e)
{
Log.e("DB ERROR", e.toString());
e.printStackTrace();
}
}
public void deleteAllData(){
// попросите менеджера баз данных удалить строку данного идентификатора
try {db.delete(TABLE_NAME, null, null);}
catch (Exception e)
{
Log.e("DB ERROR", e.toString());
e.printStackTrace();
}
}
public void updateData(long id, int quantity, double total_price){
// это ключевой держатель пары значений, используемый функциями SQLite для Android
ContentValues values = new ContentValues();
values.put(QUANTITY, quantity);
values.put(TOTAL_PRICE, total_price);
// попросите объект базы данных обновить строку базы данных заданного rowID
try {db.update(TABLE_NAME, values, ID + "=" + id, null);}
catch (Exception e)
{
Log.e("DB Error", e.toString());
e.printStackTrace();
}
}
}
А вот так я отправляю в заказ в корзину:
// когда нажали кнопку добавления, добавить меню в таблицу заказов в базе данных
if(!temp.equalsIgnoreCase("")){
quantity = Integer.parseInt(temp);
if(dbhelper.isDataExist(Menu_ID)){
dbhelper.updateData(Menu_ID, quantity, (Menu_price*quantity));
}else{
dbhelper.addData(Menu_ID, Menu_name, quantity, (Menu_price*quantity),Menu_quantity);
}
}else{
dialog.cancel();
}
}
});
Помогите пожалуйста ,самому ни как не разобраться . У меня есть в директории assets
файл под названием db_order
, пытался его открыть а там какая то абракадабра ,не читается этот файл ,возможно зашифрован.
Вот эта часть отменила Вашу попытку добавления нового столбца:
if(dbExist){
//ничего не делать - база данных уже существует
Чтобы его все же добавить, Вам нужно или удалить файл базы - db_order
или использовать метод onUpgrade
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion > oldVersion) {
db.execSQL("ALTER TABLE tbl_order ADD COLUMN Menu_quantity INTEGER DEFAULT 0");
}
}
Как верно заметил @pavlofff, для срабатывания метода onUpgrade
следует увеличить версию базы:
public final static int DB_VERSION = 11;
Добавлено
Функции onCreate
и onUpgrade
вызываются, когда база данных открывается с использованием методов SQLiteOpenHelper
: getWritableDatabase
или getReadableDatabase
.
В объекте DBHelper
, показанном в вопросе, база данных открывается, используя SQLiteDatabase.openDatabase
. Соответственно, функции onCreate
и onUpgrade
- не вызываются
Добавьте в Ваш класс:
private SQLiteOpenHelper dbHelper;
Далее:
public DBHelper(Context context) {
dbHelper = super(context, DB_NAME, null, DB_VERSION);
Далее:
public void openDataBase() throws SQLException{
db = dbHelper.getWritableDatabase();
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Являюсь абсолютным новичком в Java (соответственно в Android dev-e)Прочитав статью конца зимы 2011 года (https://habr
Не понимаю почему text в sout(e) подсвечивает красным и не работает программа, подсказка пишет:
На сайте присутствует видео фон, которой перезагружается постоянно при смене языка, так как nuxtjs обновляет router-view и добавляет transition, это напрягает