SQLite не работает с некоторыми именами таблиц? - PullRequest
0 голосов
/ 23 октября 2018

Я учусь создавать приложения для 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);
}

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

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

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

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

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

  • ABORT
  • ДЕЙСТВИЕ
  • ДОБАВИТЬ
  • ПОСЛЕ
  • ВСЕ
  • ALTER
  • АНАЛИЗ
  • И
  • AS
  • ASC
  • ATTACH
  • AUTOINCREMENT
  • ДО
  • НАЧАТЬ
  • МЕЖДУ
  • BY
  • CASCADE
  • CASE
  • CAST
  • CHECK
  • COLLATE
  • COLUMN
  • COMMIT
  • CONFLICT
  • CONSTRAINT
  • CREATE
  • CROSS
  • CURRENT
  • CURRENT_DATE
  • CURRENT_TIME
  • CURRENT_TIMESTAMP
  • База данных
  • DEFAULT
  • DEFERRABLE
  • DEFERRED
  • DELETE
  • DESC
  • DETACH
  • DISTINCT
  • DO
  • DROP
  • EACH
  • ELSE
  • END
  • ESCAPE
  • EXCEPT
  • EXCLUSIVE
  • EXISTS
  • EXPLAIN
  • FAIL
  • ФИЛЬТР
  • СЛЕДУЮЩИЙ
  • ДЛЯ
  • ИНОСТРАННЫЙ
  • ОТ
  • ПОЛНЫЙ
  • ГЛОБ
  • ГРУППА
  • ИМЕЕТ
  • ЕСЛИ
  • ИГНОРИРУЕТ
  • НЕМЕДЛЕННО
  • В
  • УКАЗАН
  • УКАЗАН
  • ПЕРВОНАЧАЛЬНО
  • ВНУТРЕННИЙ
  • ВСТАВИТЬ
  • INSTEAD
  • INTERSECT
  • INTO
  • IS
  • ISNULL
  • JOIN
  • KEY
  • ВЛЕВО
  • LIKE
  • LIMIT
  • MATCH
  • ЕСТЕСТВЕННЫЙ
  • НЕТ
  • НЕ
  • НИЧЕГО
  • NOTNULL
  • NULL
  • из
  • OFFSET
  • ON
  • ИЛИ
  • ЗАКАЗ
  • OUTER
  • OVER
  • PARTITION
  • ПЛАН
  • ПРАГМА
  • ПРЕДВАРИТЕЛЬНЫЙ
  • ПЕРВИЧНЫЙ
  • ЗАПРОС
  • RAISE
  • RANGE
  • RECURSIVE
  • ССЫЛКИ
  • REGEXP
  • REINDEX
  • RELEASE
  • RENAME
  • ЗАМЕНИТЬ
  • RESTRICT
  • RIGHT
  • ROLLBACK
  • ROW
  • ROWS
  • SAVEPOINT
  • SELECT
  • SET
  • TABLE
  • TEMP
  • TEMPORARY
  • THEN
  • TO
  • СДЕЛКА
  • TRIGGER
  • UNBOUNDED
  • UNION
  • UNIQUE
  • UPDATE
  • USING
  • ВАКУУМ
  • ЗНАЧЕНИЯ
  • ВИД
  • ВИРТУАЛЬНЫЙ
  • КОГДА
  • ГДЕ
  • ОКНО
  • С
  • БЕЗ
0 голосов
/ 23 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...