Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Vlad161
0 / 0 / 0
Регистрация: 02.01.2011
Сообщений: 49
#1

Ошибка при записи данных в SQLite

27.10.2013, 17:40. Просмотров 1465. Ответов 10
Метки нет (Все метки)

Нужно добавить данные в БД SQLite, добавить нужно только текст. Проект запускается, но при нажатии на кнопку программа падает, в чем беда? И еще почему то не делает ++n и вывод в TextView, делает только 1 раз, в первый раз, дальше 1 счетчик не идет хотя должен.

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package ru.vlad.keeper;
 
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
 
public class MainActivity extends Activity {
    
    final String LOG_TAG = "myLogs";
 
    TextView tvOut;
    EditText etAdd;
    Button btnKeep;
    ListView listKeep;
 
    DBHelper dbHelper;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        listKeep = (ListView) findViewById(R.id.listKeep);
 
        tvOut = (TextView) findViewById(R.id.tvOut);
 
        etAdd = (EditText) findViewById(R.id.etAdd);
 
        btnKeep = (Button) findViewById(R.id.btnKeep);
        
        btnKeep.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                
              ContentValues cv = new ContentValues();
 
              String text = etAdd.getText().toString();
 
              SQLiteDatabase db = dbHelper.getWritableDatabase();
                
                int n = 0;
              
                tvOut.setText("Btn Activ " + ++n);
                Log.d(LOG_TAG, "--- Insert in mytable: ---");
                
                cv.put("text", text);
                long rowID = db.insert("myTable", null, cv);
                Log.d(LOG_TAG, "row inserted, ID = " + rowID);
                
                
            }
        });
        
    }
   
}
 
 
class DBHelper extends SQLiteOpenHelper {
 
    final String LOG_TAG = "myLogs";
 
    public DBHelper(Context context) {
        super(context, "myDB", null, 1);
    }
 
 
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
 
        SQLiteDatabase db = getWritableDatabase();
 
        Log.d(LOG_TAG, "--- onCreate database ---");
        db.execSQL("create table mytable ("
                + "text" + ");");
 
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 
    }
}
Если закоментировать это, то приложение не крашится, но счетчик все равно не считает

Java
1
2
3
4
5
6
7
ContentValues cv = new ContentValues();
String text = etAdd.getText().toString();
SQLiteDatabase db = dbHelper.getWritableDatabase();
 
cv.put("text", text);
long rowID = db.insert("myTable", null, cv);
Log.d(LOG_TAG, "row inserted, ID = " + rowID);

Лог ошибок
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
10-27 09:34:30.737: W/dalvikvm(1202): threadid=1: thread exiting with uncaught exception (group=0x41465700)
10-27 09:34:30.801: E/AndroidRuntime(1202): FATAL EXCEPTION: main
10-27 09:34:30.801: E/AndroidRuntime(1202): java.lang.NullPointerException
10-27 09:34:30.801: E/AndroidRuntime(1202):     at ru.vlad.keeper.MainActivity$1.onClick(MainActivity.java:48)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at android.view.View.performClick(View.java:4240)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at android.view.View$PerformClick.run(View.java:17721)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at android.os.Handler.handleCallback(Handler.java:730)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at android.os.Looper.loop(Looper.java:137)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at android.app.ActivityThread.main(ActivityThread.java:5103)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at java.lang.reflect.Method.invokeNative(Native Method)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at java.lang.reflect.Method.invoke(Method.java:525)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-27 09:34:30.801: E/AndroidRuntime(1202):     at dalvik.system.NativeStart.main(Native Method)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2013, 17:40
Ответы с готовыми решениями:

Ошибка при записи данных в файл
Помогите пожалуйста!! Вот лог ошибки: java.lang.NullPointerException: Attempt...

Как найти id записи в SQlite таблице при клике на кнопку расположенную в Listview item?
привет ! подскажите пожалуйста решение((( Кейс: у меня есть листвью ,...

Ошибка при создании SQLite
При запуске приложения вылетает ошибка: 03-09 11:04:42.436 ...

SQLite, ошибка: не существует поля "почта" в базе данных
Создал самую простую программку для понимания баз данных SQLite. Есть два...

Узнать номер записи по id (SQLite)
Привет! Осваиваю SQLite, столкнулся с проблемой. Мне нужно получить номер...

10
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
27.10.2013, 18:38 #2
dbHelper null. Вы же его нигде не создали.
0
Vlad161
0 / 0 / 0
Регистрация: 02.01.2011
Сообщений: 49
27.10.2013, 18:51  [ТС] #3
Цитата Сообщение от YuraAAA Посмотреть сообщение
dbHelper null. Вы же его нигде не создали.
Я новичок в этом. Прошелся опять же глазами по коду, так и не понял как решить проблему. Не могли бы вы по подробней написать что да как. И почему счетчик не работает? Ведь не из за dbHelper
0
olorin3000
2 / 2 / 0
Регистрация: 27.09.2012
Сообщений: 48
27.10.2013, 19:26 #4
Попробуйте в процедуру onCreate добавить:
dbHelper=new DBHelper(this);
0
Vlad161
0 / 0 / 0
Регистрация: 02.01.2011
Сообщений: 49
27.10.2013, 22:03  [ТС] #5
Цитата Сообщение от olorin3000 Посмотреть сообщение
Попробуйте в процедуру onCreate добавить:
dbHelper=new DBHelper(this);
Все равно приложение падает

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package ru.vlad.keeper;
 
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
 
public class MainActivity extends Activity {
    
    final String LOG_TAG = "myLogs";
 
    TextView tvOut;
    EditText etAdd;
    Button btnKeep;
    ListView listKeep;
 
    DBHelper dbHelper;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        dbHelper = new DBHelper(this);
        
        listKeep = (ListView) findViewById(R.id.listKeep);
 
        tvOut = (TextView) findViewById(R.id.tvOut);
 
        etAdd = (EditText) findViewById(R.id.etAdd);
 
        btnKeep = (Button) findViewById(R.id.btnKeep);
        
        btnKeep.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                
              ContentValues cv = new ContentValues();
 
              String text = etAdd.getText().toString();
 
              SQLiteDatabase db = dbHelper.getWritableDatabase();
                
                int n = 0;
              
                tvOut.setText("Btn Activ " + ++n);
                Log.d(LOG_TAG, "--- Insert in mytable: ---");
                
                cv.put("text", text);
                long rowID = db.insert("myTable", null, cv);
                Log.d(LOG_TAG, "row inserted, ID = " + rowID);
                
                
            }
        });
      
        
        
    }
   
}
 
 
class DBHelper extends SQLiteOpenHelper {
 
    final String LOG_TAG = "myLogs";
 
    public DBHelper(Context context) {
        super(context, "myDB", null, 1);
    }
 
 
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
 
        SQLiteDatabase db = getWritableDatabase();
 
        Log.d(LOG_TAG, "--- onCreate database ---");
        db.execSQL("create table mytable ("
                + "text" + ");");
 
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 
    }
}
Добавлено через 5 минут
Собственно ошибки теперь такие
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
10-27 13:57:13.902: W/dalvikvm(824): threadid=1: thread exiting with uncaught exception (group=0x41465700)
10-27 13:57:13.932: E/AndroidRuntime(824): FATAL EXCEPTION: main
10-27 13:57:13.932: E/AndroidRuntime(824): java.lang.IllegalStateException: getDatabase called recursively
10-27 13:57:13.932: E/AndroidRuntime(824):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:204)
10-27 13:57:13.932: E/AndroidRuntime(824):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
10-27 13:57:13.932: E/AndroidRuntime(824):  at ru.vlad.keeper.DBHelper.onCreate(MainActivity.java:84)
10-27 13:57:13.932: E/AndroidRuntime(824):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
10-27 13:57:13.932: E/AndroidRuntime(824):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
10-27 13:57:13.932: E/AndroidRuntime(824):  at ru.vlad.keeper.MainActivity$1.onClick(MainActivity.java:50)
10-27 13:57:13.932: E/AndroidRuntime(824):  at android.view.View.performClick(View.java:4240)
10-27 13:57:13.932: E/AndroidRuntime(824):  at android.view.View$PerformClick.run(View.java:17721)
10-27 13:57:13.932: E/AndroidRuntime(824):  at android.os.Handler.handleCallback(Handler.java:730)
10-27 13:57:13.932: E/AndroidRuntime(824):  at android.os.Handler.dispatchMessage(Handler.java:92)
10-27 13:57:13.932: E/AndroidRuntime(824):  at android.os.Looper.loop(Looper.java:137)
10-27 13:57:13.932: E/AndroidRuntime(824):  at android.app.ActivityThread.main(ActivityThread.java:5103)
10-27 13:57:13.932: E/AndroidRuntime(824):  at java.lang.reflect.Method.invokeNative(Native Method)
10-27 13:57:13.932: E/AndroidRuntime(824):  at java.lang.reflect.Method.invoke(Method.java:525)
10-27 13:57:13.932: E/AndroidRuntime(824):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-27 13:57:13.932: E/AndroidRuntime(824):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-27 13:57:13.932: E/AndroidRuntime(824):  at dalvik.system.NativeStart.main(Native Method)
10-27 13:57:18.793: I/Process(824): Sending signal. PID: 824 SIG: 9
0
Kiryna
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 11
27.10.2013, 22:27 #6
У Вас при создании таблицы не указано имя столбца, который text
0
Vlad161
0 / 0 / 0
Регистрация: 02.01.2011
Сообщений: 49
27.10.2013, 23:41  [ТС] #7
Цитата Сообщение от Kiryna Посмотреть сообщение
У Вас при создании таблицы не указано имя столбца, который text
А как решить эту проблему?
0
Kiryna
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 11
27.10.2013, 23:59 #8
В данном случае:
название столбца
Java
1
private static final String COLUMN_NAME = "column"
значение

Java
1
cv.put(COLUMN_NAME, text);
и создание таблицы

Java
1
2
db.execSQL("create table mytable ("
                + COLUMN_NAME + "text" + ");");
Кроме того, если планируется использовать Cursor, то нужно еще столбец _id, т.е.

Java
1
2
3
db.execSQL("create table mytable ("
                + "_id" + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                + COLUMN_NAME + "text" + ");");
А вообще, стоит почитать уроки по SQLite, и поучится составлять запросы
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
28.10.2013, 20:49 #9
Цитата Сообщение от Vlad161 Посмотреть сообщение
Java
1
2
3
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
SQLiteDatabase db = getWritableDatabase();
зачем вы используете getWritableDatabase если у вас уже есть sqLiteDatabase?
0
Vlad161
0 / 0 / 0
Регистрация: 02.01.2011
Сообщений: 49
28.10.2013, 22:38  [ТС] #10
Все равно крашится.

Вот код
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package ru.vlad.keeper;
 
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
 
public class MainActivity extends Activity {
    
    static final String COLUMN_NAME = "column";
    
    final String LOG_TAG = "myLogs";
 
    TextView tvOut;
    EditText etAdd;
    Button btnKeep;
    ListView listKeep;
 
    DBHelper dbHelper;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        dbHelper = new DBHelper(this);
        
        listKeep = (ListView) findViewById(R.id.listKeep);
 
        tvOut = (TextView) findViewById(R.id.tvOut);
 
        etAdd = (EditText) findViewById(R.id.etAdd);
 
        btnKeep = (Button) findViewById(R.id.btnKeep);
        
        btnKeep.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                
              ContentValues cv = new ContentValues();
 
              String text = etAdd.getText().toString();
 
              SQLiteDatabase db = dbHelper.getWritableDatabase();
                
                int n = 0;
              
                tvOut.setText("Btn Activ " + ++n);
                Log.d(LOG_TAG, "--- Insert in mytable: ---");
                
                cv.put(COLUMN_NAME, text);
                long rowID = db.insert("myTable", null, cv);
                Log.d(LOG_TAG, "row inserted, ID = " + rowID);
                
                
            }
        });
      
        
        
    }
   
}
 
 
class DBHelper extends SQLiteOpenHelper {
 
    final String LOG_TAG = "myLogs";
 
    public DBHelper(Context context) {
        super(context, "myDB", null, 1);
    }
 
 
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
 
        SQLiteDatabase db = getWritableDatabase();
 
        Log.d(LOG_TAG, "--- onCreate database ---");
        db.execSQL("create table mytable ("
                + "_id" + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                + MainActivity.COLUMN_NAME + "text" + ");");
 
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 
    }
}
Вот что пишет
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
10-28 14:18:30.508: D/AndroidRuntime(944): Shutting down VM
10-28 14:18:30.508: W/dalvikvm(944): threadid=1: thread exiting with uncaught exception (group=0x41465700)
10-28 14:18:30.538: E/AndroidRuntime(944): FATAL EXCEPTION: main
10-28 14:18:30.538: E/AndroidRuntime(944): java.lang.IllegalStateException: getDatabase called recursively
10-28 14:18:30.538: E/AndroidRuntime(944):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:204)
10-28 14:18:30.538: E/AndroidRuntime(944):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
10-28 14:18:30.538: E/AndroidRuntime(944):  at ru.vlad.keeper.DBHelper.onCreate(MainActivity.java:86)
10-28 14:18:30.538: E/AndroidRuntime(944):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
10-28 14:18:30.538: E/AndroidRuntime(944):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
10-28 14:18:30.538: E/AndroidRuntime(944):  at ru.vlad.keeper.MainActivity$1.onClick(MainActivity.java:52)
10-28 14:18:30.538: E/AndroidRuntime(944):  at android.view.View.performClick(View.java:4240)
10-28 14:18:30.538: E/AndroidRuntime(944):  at android.view.View$PerformClick.run(View.java:17721)
10-28 14:18:30.538: E/AndroidRuntime(944):  at android.os.Handler.handleCallback(Handler.java:730)
10-28 14:18:30.538: E/AndroidRuntime(944):  at android.os.Handler.dispatchMessage(Handler.java:92)
10-28 14:18:30.538: E/AndroidRuntime(944):  at android.os.Looper.loop(Looper.java:137)
10-28 14:18:30.538: E/AndroidRuntime(944):  at android.app.ActivityThread.main(ActivityThread.java:5103)
10-28 14:18:30.538: E/AndroidRuntime(944):  at java.lang.reflect.Method.invokeNative(Native Method)
10-28 14:18:30.538: E/AndroidRuntime(944):  at java.lang.reflect.Method.invoke(Method.java:525)
10-28 14:18:30.538: E/AndroidRuntime(944):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-28 14:18:30.538: E/AndroidRuntime(944):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-28 14:18:30.538: E/AndroidRuntime(944):  at dalvik.system.NativeStart.main(Native Method)
10-28 14:18:34.459: I/Process(944): Sending signal. PID: 944 SIG: 9
Добавлено через 11 минут
Ошибку исправил. Беда была тут:
Вместо этого
Java
1
2
3
 public void onCreate(SQLiteDatabase sqLiteDatabase) {
 
        SQLiteDatabase db = getWritableDatabase();
Надо вот так
Java
1
2
3
 public void onCreate(SQLiteDatabase db) {
 
        //SQLiteDatabase db = getWritableDatabase(); эту строчку удалить
Добавлено через 4 минуты
А вообще понял, что на начальном уровне брать куски кода из уроков и изменять их под себя не лучший вариант. Пошел читать Шилдта - Java полное руководство 8е издание, до БД я еще не дошел.

Всем спасибо
0
Kiryna
0 / 0 / 0
Регистрация: 26.10.2013
Сообщений: 11
28.10.2013, 22:46 #11
Цитата Сообщение от Vlad161 Посмотреть сообщение
Ошибку исправил. Беда была тут:
Я бы сказала, и там, и тут. Вот тут короткие уроки по SQLite, для старта, так сказать

Цитата Сообщение от Vlad161 Посмотреть сообщение
А вообще понял, что на начальном уровне брать куски кода из уроков и изменять их под себя не лучший вариант.
Хорошее решение
0
28.10.2013, 22:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2013, 22:46

SQLite дополнить записи из таблицы
Можно ли составить подобный запрос (вроде видел нечто подобное, но повторно...

SQLite как получить номер записи из INSERT
Собственно САБЖ. Не знаю команды. Уже все перерыл! :( Есть база с id INTEGER...

Data Base ошибка при записи
Запись в БД: ContentValues HS = new ContentValues(); ...


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

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

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