Я учусь создавать приложения для Android с использованием Java, так что извините, если этот вопрос возникнет как noob.

Итак, я создал ListView и связал с ним базу данных SQLite.

Когда я открываю приложение, загружается список.

Теперь, если мои имена таблиц - TITLE, LOCATION и DESCRIPTION, все вылетает при запуске, говоря, что таблицы TITLE и LOCATION не существуют.

Но если имена моих таблиц - NAME, ABC и DESCRIPTION, приложение загружается, даже если этих таблиц не существует.

SQLiteDatabaseHandler.java :

public class SQLiteDatabaseHandler extends SQLiteOpenHelper {

private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "remindersdb";
private static final String TABLE_NAME = "reminders";
private static final String KEY_ID = "ID";
private static final String KEY_NAME = "TITLE";
private static final String KEY_LOC = "LOCATION";
private static final String KEY_DESCRIPTION = "DESCRIPTION";
private static final String[] COLUMNS = {KEY_ID, KEY_NAME, KEY_LOC, KEY_DESCRIPTION};

public SQLiteDatabaseHandler(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}


@Override
public void onCreate(SQLiteDatabase db) {
    //db.execSQL("create table " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME TEXT,ABC TEXT,DESCRIPTION TEXT)");
db.execSQL("create table reminders (ID INTEGER PRIMARY KEY AUTOINCREMENT, TITLE TEXT, LOCATION TEXT, DESCRIPTION TEXT)");

}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}


public void insertData(String name, String location1, String description) {

    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues cValues = new ContentValues();
    cValues.put(KEY_NAME, name);
    cValues.put(KEY_LOC, location1);
    cValues.put(KEY_DESCRIPTION, description);
    long newRowId = db.insert(TABLE_NAME, null, cValues);
    db.close();

    /*SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(KEY_NAME,name);
    contentValues.put(KEY_POSITION,position);
    contentValues.put(KEY_DESCRIPTION,description);
    long result = db.insert(TABLE_NAME,null ,contentValues);
    if(result == -1)
        return false;
    else
        return true;*/
}


public boolean updateData(String id, String name, String location1, String description) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(KEY_ID, id);
    contentValues.put(KEY_NAME, name);
    contentValues.put(KEY_LOC, location1);
    contentValues.put(KEY_DESCRIPTION, description);
    db.update(TABLE_NAME, contentValues, "ID = ?", new String[]{id});
    return true;
}



public ArrayList<HashMap<String, String>> getData() {
    SQLiteDatabase db = this.getWritableDatabase();
    ArrayList<HashMap<String, String>> userList = new ArrayList<>();
    String query = "SELECT TITLE, LOCATION, DESCRIPTION FROM " + TABLE_NAME;
    Cursor cursor = db.rawQuery(query, null);
    while (cursor.moveToNext()) {
        HashMap<String, String> user = new HashMap<>();
        user.put("name", cursor.getString(cursor.getColumnIndex(KEY_NAME)));
        user.put("location1", cursor.getString(cursor.getColumnIndex(KEY_LOC)));
        userList.add(user);
    }
    return userList;
}



/*public Cursor getAllData() {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.rawQuery("select * from "+TABLE_NAME,null);
    return res;
}*/


public void deleteData(String id) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(TABLE_NAME, KEY_ID + " = ?", new String[]{String.valueOf(id)});
    db.close();

}

MainActivity.java :

public class MainActivity extends AppCompatActivity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    SQLiteDatabaseHandler db = new SQLiteDatabaseHandler(this);

    ArrayList<HashMap<String, String>> userList = db.getData();


    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    //ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this, R.layout.content_main, R.id.textview1 , mobileArray);

    ListView lv = (ListView) findViewById(R.id.listView1);

    ListAdapter adapter = new SimpleAdapter(MainActivity.this, userList, R.layout.list_row,new String[]{"TITLE","LOCATION","DESCRIPTION"}, new int[]{R.id.name, R.id.designation, R.id.location});lv.setAdapter(adapter);





    FloatingActionButton fab = findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            /*Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();*/
            Intent intent = new Intent(MainActivity.this, CreateActivity.class);
            startActivity(intent);


        }
    });

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

Я вырезал базовый код из-за проблем с форматированием, таких как операторы импорта.

-1
user5793353 23 Окт 2018 в 19:26

2 ответа

Лучший ответ

Вы имеете в виду имена столбцов, а не имена таблиц.
Возможно, когда вы впервые создали свою базу данных, имена столбцов, где NAME, ABC, и теперь вы хотите изменить их на TITLE, LOCATION, просто изменив эти значения в {{X4 } } .
Что ж, это не так просто.
Удалите ваше приложение с эмулятора / устройства, на котором вы его тестируете, чтобы база данных была удалена, а затем повторно запустите измененный код. Таким образом БД воссоздаст таблицы с новыми именами.
Вы видите, что метод onCreate() для SQLiteDatabaseHandler запускается не каждый раз, когда вы запускаете приложение, а только в том случае, если нет базы данных или есть обновление версии базы данных.

0
forpas 23 Окт 2018 в 16:56

Проверьте эту ветку: SQL в понимании SQLite

Стандарт SQL определяет большое количество ключевых слов, которые нельзя использовать в качестве имен таблиц, индексов, столбцов, баз данных, пользовательских функций, сопоставлений, модулей виртуальных таблиц или любого другого именованного объекта. Список ключевых слов настолько велик, что мало кто может запомнить их все. Для большей части кода SQL самый безопасный вариант - никогда не использовать какое-либо слово на английском языке в качестве имени определяемого пользователем объекта.

И это весь список:

  • ABORT
  • ДЕЙСТВИЯ
  • ДОБАВИТЬ
  • ПОСЛЕ
  • ВСЕ
  • ALTER
  • ПРОАНАЛИЗИРУЙТЕ
  • И
  • В КАЧЕСТВЕ
  • ASC
  • ПРИКРЕПЛЯТЬ
  • АВТОМАТИЧЕСКОЕ ПРИРАЩЕНИЕ
  • ДО
  • НАЧАТЬ
  • МЕЖДУ
  • ОТ
  • CASCADE
  • КЕЙС
  • БРОСАТЬ
  • ПРОВЕРИТЬ
  • СОРТИРОВКА
  • КОЛОНКА
  • COMMIT
  • КОНФЛИКТ
  • CONSTRAINT
  • СОЗДАЙТЕ
  • ПЕРЕСЕКАТЬ
  • ТОК
  • ТЕКУЩАЯ ДАТА
  • ТЕКУЩЕЕ ВРЕМЯ
  • CURRENT_TIMESTAMP
  • БАЗА ДАННЫХ
  • ДЕФОЛТ
  • откладываемые
  • DEFERRED
  • УДАЛЯТЬ
  • DESC
  • DETACH
  • DISTINCT
  • ДЕЛАТЬ
  • DROP
  • КАЖДЫЙ
  • ELSE
  • КОНЕЦ
  • ПОБЕГ
  • КРОМЕ
  • ЭКСКЛЮЗИВ
  • СУЩЕСТВУЮТ
  • EXPLAIN
  • ПОТЕРПЕТЬ ПОРАЖЕНИЕ
  • ФИЛЬТР
  • СЛЕДУЮЩИЙ
  • ДЛЯ
  • ИНОСТРАННЫЕ
  • ИЗ
  • ПОЛНЫЙ
  • GLOB
  • GROUP
  • HAVING
  • ЕСЛИ
  • ИГНОРИРУЙТЕ
  • СРОЧНАЯ
  • В
  • ИНДЕКС
  • индексированный
  • ПЕРВОНАЧАЛЬНО
  • ВНУТРЕННИЙ
  • ВСТАВИТЬ
  • ВМЕСТО
  • ПЕРЕСЕЧЕНИЕ
  • В
  • ЯВЛЯЕТСЯ
  • НУЛЕВОЙ
  • ПРИСОЕДИНИТЬСЯ
  • KEY
  • ОСТАЛОСЬ
  • НРАВИТЬСЯ
  • ПРЕДЕЛ
  • СОВПАДЕНИЕ
  • ПРИРОДНЫЙ
  • НЕТ
  • НЕ
  • НИЧЕГО
  • НЕ НОЛЬ
  • ЗНАЧЕНИЕ NULL
  • О
  • OFFSET
  • НА
  • Или
  • ЗАКАЗ
  • ВНЕШНИЙ
  • НАД
  • PARTITION
  • ПЛАН
  • ПРАГМА
  • ПРЕДЫДУЩИЙ
  • ПЕРВИЧНЫЙ
  • QUERY
  • ПОДЪЕМ
  • АССОРТИМЕНТ
  • RECURSIVE
  • ССЫЛКИ
  • REGEXP
  • REINDEX
  • РЕЛИЗ
  • ПЕРЕИМЕНОВАТЬ
  • ЗАМЕНА
  • RESTRICT
  • ПРАВИЛЬНО
  • ROLLBACK
  • СТРОКА
  • РЯДЫ
  • SAVEPOINT
  • ВЫБРАТЬ
  • УСТАНАВЛИВАТЬ
  • СТОЛ
  • TEMP
  • ВРЕМЕННОЕ
  • ТОГДА
  • Кому
  • СДЕЛКА
  • КУРОК
  • неограниченный
  • UNION
  • УНИКАЛЬНАЯ
  • ОБНОВИТЬ
  • С ПОМОЩЬЮ
  • ВАКУУМНАЯ
  • ЦЕННОСТИ
  • ПОСМОТРЕТЬ
  • ВИРТУАЛЬНЫЙ
  • КОГДА
  • ГДЕ
  • ОКНО
  • С
  • БЕЗ
0
MrMins 23 Окт 2018 в 17:01
52953782