Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
qdhtnsoyndtr
5 / 5 / 1
Регистрация: 29.11.2013
Сообщений: 466
#1

База SQLite: метод по созданию таблицы не вызывается - Программирование Android

15.02.2016, 15:45. Просмотров 807. Ответов 30
Метки нет (Все метки)

Не пойму что не так.
Раньше с ним не работал
Пытался реализовать пример из сети, но что то не хочет, подозреваю что не создана сама база, а точнее что не вызывается метод по созданию.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public class NewDB extends Activity {
 
    final String LOG_TAG = "myLogs";
 
    DBHelper dbHelper;
 
    public void Insert(String text, String title) {
 
        dbHelper = new DBHelper(this);
 
        // создаем объект для данных
        ContentValues cv = new ContentValues();
 
        // подключаемся к БД
        SQLiteDatabase db = dbHelper.getWritableDatabase();
 
        Log.d(LOG_TAG, "--- Insert in mytable: ---");
        // подготовим данные для вставки в виде пар: наименование столбца - значение
 
        cv.put("name", text);
        cv.put("email", title);
        // вставляем запись и получаем ее ID
        long rowID = db.insert("mytable", null, cv);
        Log.d(LOG_TAG, "row inserted, ID = " + rowID);
 
        // закрываем подключение к БД
        dbHelper.close();
 
    }
 
    class DBHelper extends SQLiteOpenHelper {
 
        public DBHelper(Context context) {
            // конструктор суперкласса
            super(context, "myDB", null, 1);
        }
 
        @Override
        public void onCreate(SQLiteDatabase db) {
            Log.d(LOG_TAG, "--- onCreate database ---");
            // создаем таблицу с полями
            db.execSQL("create table mytable ("
                    + "id integer primary key autoincrement,"
                    + "name text,"
                    + "email text" + ");");
        }
 
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 
        }
    }
 
}
ошибки
User-space exception detected!
java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference

FATAL EXCEPTION: main
java.lang.RuntimeException: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.02.2016, 15:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос База SQLite: метод по созданию таблицы не вызывается (Программирование Android):

База данных SQLite - Программирование Android
Добрый день. Может я повторюсь с вопросом, но вы уж меня простите, не могу найти... Подскажите, пожалуйста, где можно прочитать как создать...

База данных sqlite - Программирование Android
Доброго времени суток. Пишу приложение в котором возможна отправка запросов и на вставку и на чтение БД. Насколько я ...

AutoCompleteTextView + база sqlite - Программирование Android
Вопрос вот в чем, имеется база и элемент AutoCompleteTextView. Задача в том, чтобы в AutoCompleteTextView подгружался столбец с названиями...

Подскажите - не вызывается метод в потоке - Программирование Android
progress = ProgressDialog.show(getActivity(), "Please wait...", "Applying changes may take a few minutes.",...

SQLite база данных с паролем - Программирование Android
Есть база данных защищенная ключом! Сама база данных хранится на устройстве. При подключении к базе надо как то передать пароль, но в...

SQLite база данных (новичек) - Программирование Android
Здравствуйте уважаемые программисты. Подскажите пожалуйста как можно при создании таблицы в базе данных вытаскивать название с...

30
xaat
43 / 16 / 6
Регистрация: 05.12.2015
Сообщений: 65
15.02.2016, 17:06 #16
вместо просто id, принято писать "_id"
Ну это ведь вы говорите, что нужно так, а я спрашиваю аргументы)
Ну попробуй использовать например SimpleCursorAdapter с первичным ключем отличны от "_id", да и кроме этого хватает проблем.
Вот кусок из адаптера для RecyclerView
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public Cursor swapCursor(Cursor newCursor) {
        if (newCursor == mCursor) {
            return null;
        }
        Cursor oldCursor = mCursor;
        mCursor = newCursor;
        if (newCursor != null) {
            mRowIDColumn = newCursor.getColumnIndexOrThrow("_id");
            mDataValid = true;
            // notify the observers about the new cursor
            notifyDataSetChanged();
        } else {
            mRowIDColumn = -1;
            mDataValid = false;
            // notify the observers about the lack of a data set
            notifyItemRangeRemoved(0, getItemCount());
        }
        return oldCursor;
    }
0
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,654
Завершенные тесты: 1
15.02.2016, 17:18 #17
xaat, попробовал
Java
1
2
3
4
5
6
public static final String USER_ID = "user_id";
public static final String USER_NAME = "name";
 
User user = new User();
user.setId(cursor.getInt(cursor.getColumnIndex(USER_ID)));
user.setName(cursor.getString(cursor.getColumnIndex(USER_NAME)));
Из реального кода скопировал - вполне работает.
0
Pablito
2525 / 2004 / 624
Регистрация: 12.05.2014
Сообщений: 7,030
Завершенные тесты: 1
15.02.2016, 17:22 #18
создай новую таблицу и укажи там имя autoincrement поля что-то отличное от _id
об этом речь, а не об обычных полях
0
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,654
Завершенные тесты: 1
15.02.2016, 17:23 #19
Паблито, ну вот из создания той же таблицы
Java
1
INTEGER PRIMARY KEY AUTOINCREMENT
0
Pablito
2525 / 2004 / 624
Регистрация: 12.05.2014
Сообщений: 7,030
Завершенные тесты: 1
15.02.2016, 17:24 #20
Spelcrawler, База SQLite: метод по созданию таблицы не вызывается
и что мне дает этот текст ? INTEGER PRIMARY KEY AUTOINCREMENT
там даже не указано имя
0
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,654
Завершенные тесты: 1
15.02.2016, 17:31 #21
Цитата Сообщение от Паблито Посмотреть сообщение
и что мне дает этот текст ? INTEGER PRIMARY KEY AUTOINCREMENT
там даже не указано имя
Ну в коде не целиком строка, потому вырвал кусок с параметрами колонки ид. Имя у нее user_id.
0
xaat
43 / 16 / 6
Регистрация: 05.12.2015
Сообщений: 65
15.02.2016, 17:31 #22
Из реального кода скопировал - вполне работает.
Ты по русски понимаешь? SimpleCursorAdapter!
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
// открываем подключение к БД
        private DbConnections db;
        private SimpleCursorAdapter scAdapter;
        db = new DbConnections(this);
 
        String[] from = new String[]{AppData.DB_TBL_GLOSSARY_TITLE, AppData.DB_TBL_GLOSSARY_TEXT};
        int[] to = new int[]{R.id.listItemGlossaryTitle, R.id.listItemGlossaryText};
 
        scAdapter = new SimpleCursorAdapter(this, R.layout.list_item_glossary, null, from, to, 0);
        ListView listProduct = (ListView) findViewById(R.id.listViewGlossary);
 
        scAdapter.setViewBinder(new WineViewBinder());
        listProduct.setAdapter(scAdapter);
0
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,654
Завершенные тесты: 1
15.02.2016, 17:33 #23
xaat, ооо вон оно как, понимаю, как-то не заметил. Ну тогда вопрос снят, этим адаптером не пользуюсь.
0
Pablito
15.02.2016, 17:34
  #24

Не по теме:

алилуя

0
xaat
43 / 16 / 6
Регистрация: 05.12.2015
Сообщений: 65
15.02.2016, 18:15 #25
qdhtnsoyndtr,
Попробуй удалить приложение с устройства и установить заново.
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
15.02.2016, 18:23 #26
Цитата Сообщение от _Night_Scream_ Посмотреть сообщение
CoolMind, хотите не древний и не мохнатый?
http://www.fandroid.info/urok-34-rab...ite-v-android/
Это тут причём? Я изначально писал, что способ этот древний, основанный на багах Андроида. В современных условиях можно не эксплуатировать эту Гугловскую оплошность, а сразу писать так, как хочется - хоть id, хоть code. По крайней мере, в нехилой БД, которая у нас была, всё прекрасно работало.
0
xaat
43 / 16 / 6
Регистрация: 05.12.2015
Сообщений: 65
15.02.2016, 19:00 #27
Я изначально писал, что способ этот древний, основанный на багах Андроида.
Это не оплошность, а соглашение такое между разработчиками, стандарт... при чем здесь баги?
В современных условиях можно не эксплуатировать эту Гугловскую оплошность, а сразу писать так, как хочется - хоть id, хоть code.
Не, нельзя, все что написано, или ришется, хоть это курсор адаптеры, различные хэлперы, различные ORMы все использует _id, ну так принято.
По крайней мере, в нехилой БД, которая у нас была, всё прекрасно работало.
Ну будет работать кто спорит? ...пока не понадобится ormlite приделать или адаптер чужой, тогда не будет работать. Как вы кстати, данные из базы данных отображаете в Активити без курсор адаптера, какой то свой велосипед изобрели? Из курсора складываем в List?
0
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,654
Завершенные тесты: 1
16.02.2016, 09:48 #28
Цитата Сообщение от xaat Посмотреть сообщение
Из курсора складываем в List?
Можно и так, можно просто курсор отправить в кастомный адаптер. Зачем нужны эти ограничения стандартного адаптера?
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
16.02.2016, 18:01 #29
Цитата Сообщение от xaat Посмотреть сообщение
Это не оплошность, а соглашение такое между разработчиками, стандарт... при чем здесь баги?
Я не уверен, что это стандарт. Да, видел такое соглашение, но на нём не делается упора. Можно легко менять названия полей так, как удобно.
В одной из старых статей на "Хабре" видел, что без "_id" в старых версиях Андроида не работало. Вот потому и решил, что это баг.
Цитата Сообщение от xaat Посмотреть сообщение
Не, нельзя, все что написано, или ришется, хоть это курсор адаптеры, различные хэлперы, различные ORMы все использует _id, ну так принято.
У кого-то принято, но писать можно так, как захочешь. Не спорю, другие библиотеки могут использовать эти соглашения. Вы же в БД, допустим, Oracle не обязаны писать id в качестве поля? А уж в интерфейсе - так и подавно.
Цитата Сообщение от xaat Посмотреть сообщение
пока не понадобится ormlite приделать или адаптер чужой
Это мне неведомо, покамест не приходилось использовать чужой адаптер. Я обычно изучаю код, что там написано. Если есть такая необходимость, поменяю. Ну, пожалуй, это самый сильный аргумент за "_id".
Цитата Сообщение от xaat Посмотреть сообщение
Как вы кстати, данные из базы данных отображаете в Активити без курсор адаптера, какой то свой велосипед изобрели? Из курсора складываем в List?
Конечно, прописываю адаптер. Под каждый ListView свой.
Да, к ORM приглядываюсь, может быть, это заставит перейти на "_id".
0
Pablito
16.02.2016, 18:57     База SQLite: метод по созданию таблицы не вызывается
  #30

Не по теме:

то есть слив защитан?

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2016, 18:57
Привет! Вот еще темы с ответами:

Не создается база данных SQLite - Программирование Android
Здравствуйте уважаемы форумчане! Столкнулся с проблем, не создается база данных. При запросе данных с таблицы выскакивает ошибка и...

Android, ListView, база данных SQLite - Программирование Android
Как достать картинку из БД (SQLite) и поместить её в ListView??? помогите, пожалуйста :)

База SqLite - проверка записей на существование - Программирование Android
Помоги разрешить следующую ситуацию. у меня есть метод который получает данные из интернета в Json. Я данные разбираю и записываю в...

Метод вызывается только после второго нажатия на кнопку - Программирование Android
есть метод import com.github.nkzawa.emitter.Emitter; import com.github.nkzawa.socketio.client.Ack; import...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
16.02.2016, 18:57
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru