Урок 34. Хранение данных. SQLite

Обсуждение уроков
mickeymo121
Сообщения: 2
Зарегистрирован: 04 апр 2013, 16:37

Re: Урок 34. Хранение данных. SQLite

Сообщение mickeymo121 » 04 апр 2013, 16:52

Не могу понять в чем косяк, с андроидом общаюсь пару недель всего, так что знаю не особо много. Делал по примеру из урока, код оттуда, только изменены имена и пр.
Суть в том, что есть несколько полей для ввода текста, по нажатию кнопки это текст должен записаться в бд+передаться другой activity. В этот момент приложение падает, база данных не создается и лога по ней соотвественно тоже.

Код: Выделить всё

public class MainActivity extends Activity implements OnClickListener {

	final String LOG_TAG = "myLogs";
	 string urlfavor;
	Button btn1, btn2, btn3, btn4;
	EditText textlink1, textlink2, textlink3, textlink4;
	DBHelper dbhelp;
	

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

//if (getIntent().getBooleanExtra("finish", false)) finish();

		setContentView(R.layout.favor);

		btn1 = (Button) findViewById(R.id.link1);
		btn1.setOnClickListener(this);

		btn2 = (Button) findViewById(R.id.link2);
		btn2.setOnClickListener(this);

		btn3 = (Button) findViewById(R.id.link3);
		btn3.setOnClickListener(this);

		btn4 = (Button) findViewById(R.id.link4);
		btn4.setOnClickListener(this);

		textlink1 = (EditText) findViewById(R.id.Textlink1);
		textlink2 = (EditText) findViewById(R.id.Textlink2);
		textlink3 = (EditText) findViewById(R.id.Textlink3);
		textlink4 = (EditText) findViewById(R.id.Textlink4);

		
		
	}



	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		Intent intentfavor = new Intent(this, Tab2Activity.class);
		ContentValues cv = new ContentValues();
		String name1 = textlink1.getText().toString();
		String name2 = textlink2.getText().toString();
		SQLiteDatabase dbfavor = dbhelp.getWritableDatabase();
		switch (v.getId()) {
		
		case R.id.link1: intentfavor.putExtra("url1",textlink1.getText().toString());
		Log.d(LOG_TAG, "--- Insert in mytable: ---");
	      // подготовим данные для вставки в виде пар: наименование столбца - значение
	      
	      cv.put("site", name1);
	     
	      // вставляем запись и получаем ее ID
	      long rowID = dbfavor.insert("mytable", null, cv);
	      Log.d(LOG_TAG, "row inserted, ID = " + rowID);
		
		break;
		case R.id.link2: intentfavor.putExtra("url1",textlink2.getText().toString());
		
		Log.d(LOG_TAG, "--- Rows in mytable: ---");
	      // делаем запрос всех данных из таблицы mytable, получаем Cursor 
	      Cursor c = dbfavor.query("mytable", null, null, null, null, null, null);

	      // ставим позицию курсора на первую строку выборки
	      // если в выборке нет строк, вернется false
	      if (c.moveToFirst()) {

	        // определяем номера столбцов по имени в выборке
	        int idColIndex = c.getColumnIndex("id");
	        int nameColIndex = c.getColumnIndex("site");
	        

	        do {
	          // получаем значения по номерам столбцов и пишем все в лог
	          Log.d(LOG_TAG,
	              "ID = " + c.getInt(idColIndex) + 
	              ", site = " + c.getString(nameColIndex));
	          // переход на следующую строку 
	          // а если следующей нет (текущая - последняя), то false - выходим из цикла
	        } while (c.moveToNext());
	      } else
	        Log.d(LOG_TAG, "0 rows");
	      c.close();
		
		break;
		case R.id.link3: intentfavor.putExtra("url1",textlink3.getText().toString());
		
		
		break;
		case R.id.link4: intentfavor.putExtra("url1",textlink4.getText().toString());
		
		
		break;
		
		
		}
		dbhelp.close();
		
	    startActivity(intentfavor);
		
	}

	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," 
	          + "site text,"
	          +  ");");
	    }

	    @Override
	    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

	    }

	}}

При падение вот что пишется в логе, уже с десяток раз переделывал, пересоздавал, не могу понять где проблема

04-04 13:49:18.327: E/AndroidRuntime(22698): FATAL EXCEPTION: main
04-04 13:49:18.327: E/AndroidRuntime(22698): java.lang.NullPointerException
04-04 13:49:18.327: E/AndroidRuntime(22698): at com.example.browser.MainActivity.onClick(MainActivity.java:66)
04-04 13:49:18.327: E/AndroidRuntime(22698): at android.view.View.performClick(View.java:2485)
04-04 13:49:18.327: E/AndroidRuntime(22698): at android.view.View$PerformClick.run(View.java:9080)
04-04 13:49:18.327: E/AndroidRuntime(22698): at android.os.Handler.handleCallback(Handler.java:587)
04-04 13:49:18.327: E/AndroidRuntime(22698): at android.os.Handler.dispatchMessage(Handler.java:92)
04-04 13:49:18.327: E/AndroidRuntime(22698): at android.os.Looper.loop(Looper.java:123)
04-04 13:49:18.327: E/AndroidRuntime(22698): at android.app.ActivityThread.main(ActivityThread.java:3683)
04-04 13:49:18.327: E/AndroidRuntime(22698): at java.lang.reflect.Method.invokeNative(Native Method)
04-04 13:49:18.327: E/AndroidRuntime(22698): at java.lang.reflect.Method.invoke(Method.java:507)
04-04 13:49:18.327: E/AndroidRuntime(22698): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-04 13:49:18.327: E/AndroidRuntime(22698): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-04 13:49:18.327: E/AndroidRuntime(22698): at dalvik.system.NativeStart.main(Native Method)

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 34. Хранение данных. SQLite

Сообщение Foenix » 04 апр 2013, 19:05

Двойной щелчок по этому at com.example.browser.MainActivity.onClick(MainActivity.java:66)
перенесет вас в место ошибки.
Нулл - обычно означает, что куда-то он передается, где значение не должно быть нулом.
Отслеживайте его с помощью отладчика или логов.
например, где-то не находит какой-то R.id
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

mickeymo121
Сообщения: 2
Зарегистрирован: 04 апр 2013, 16:37

Re: Урок 34. Хранение данных. SQLite

Сообщение mickeymo121 » 04 апр 2013, 19:37

нашел два косяка, стыдно....
db.execSQL("create table mytable ("

+ "id integer primary key autoincrement,"

+ "site text,"

+ ");");
лишняя запятая "site text,"
Спасибо за помощь

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 34. Хранение данных. SQLite

Сообщение Foenix » 08 апр 2013, 19:35

Люди, глупый вопрос, хэлп! Как установить на другое устройство вместе с приложением готовую базу данных?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 34. Хранение данных. SQLite

Сообщение rezak90 » 08 апр 2013, 19:48

Olivka писал(а):Люди, глупый вопрос, хэлп! Как установить на другое устройство вместе с приложением готовую базу данных?
та уже десятки раз на форуме обсуждали и в гугле миллионы примеров
R.id.team
Политика на форуме запрещена

worldmen
Сообщения: 12
Зарегистрирован: 08 апр 2013, 00:04

Re: Урок 34. Хранение данных. SQLite

Сообщение worldmen » 11 апр 2013, 19:52

damager82 писал(а):
Xroft писал(а): Просило " Remove '@Override' annotation " Что я сделал и запустил приложение.
Спасибо )
У вас наверно 7-я версия Java, она ругается на Ovveride - viewtopic.php?f=3&t=117&p=149#p150
Я на шестой сижу, и иногда забываю удалять эту аннотацию из кода.
Я удалил 7-ю версию java и установил 6-ю (jre-6u43-windows-i586 и jre-6u43-windows-x64) и все равно выводит ошибку:
"The application P34_SimpleSQLite (process com.example.p34_simplesqlite) has stopped unexpectedly. Please try again."
А все остальные проекты запускаются.

Я погуглил по "МОБИЛЬНАЯ ТОРГОВЛЯ ANDROID" и нашел демо версию, установил себе на планшет. Хорошая прога (как для меня) хотелось бы сделать подобную (хотя бы половину от нее). Наше БД с которой эта прога работает. Т.е. программы на SQLite хорошо работают. Тогда не пойму в чем проблема?

DeMoZ
Сообщения: 17
Зарегистрирован: 26 мар 2013, 05:10

Re: Урок 34. Хранение данных. SQLite

Сообщение DeMoZ » 25 апр 2013, 02:32

в уроке есть описание того, как вывести данные базы в лог.
как вывести значения строчки из таблицы бд в текстовое поле ?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 34. Хранение данных. SQLite

Сообщение Foenix » 25 апр 2013, 06:20

setText
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Oplia512
Сообщения: 12
Зарегистрирован: 14 мар 2013, 20:39

Re: Урок 34. Хранение данных. SQLite

Сообщение Oplia512 » 26 апр 2013, 12:06

Всем привет! Вот читаю уроки и что-то не могу понять, как изменить запись в конкретной строке. Есть про вставить, удалить, прочитать а об изменить нету, или я что-то не заметил. Может подскажет кто?
Последний раз редактировалось Oplia512 26 апр 2013, 12:36, всего редактировалось 1 раз.

Аватара пользователя
Oplia512
Сообщения: 12
Зарегистрирован: 14 мар 2013, 20:39

Re: Урок 34. Хранение данных. SQLite

Сообщение Oplia512 » 26 апр 2013, 12:19

DeMoZ писал(а):в уроке есть описание того, как вывести данные базы в лог.
как вывести значения строчки из таблицы бд в текстовое поле ?
в TextView будет неудобно, т.к. в бд обычно более 1 записи, лучше использовать TableLayout (в помощь урок 40-41), если несколько столбцов или если в бд один столбец, то самый простой способ это ListView (урок 42).

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 34. Хранение данных. SQLite

Сообщение KamiSempai » 26 апр 2013, 13:22

Oplia512 писал(а):Всем привет! Вот читаю уроки и что-то не могу понять, как изменить запись в конкретной строке. Есть про вставить, удалить, прочитать а об изменить нету, или я что-то не заметил. Может подскажет кто?
В следующем уроке есть про изменение.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
Oplia512
Сообщения: 12
Зарегистрирован: 14 мар 2013, 20:39

Re: Урок 34. Хранение данных. SQLite

Сообщение Oplia512 » 26 апр 2013, 13:38

KamiSempai писал(а):
Oplia512 писал(а):Всем привет! Вот читаю уроки и что-то не могу понять, как изменить запись в конкретной строке. Есть про вставить, удалить, прочитать а об изменить нету, или я что-то не заметил. Может подскажет кто?
В следующем уроке есть про изменение.
Вот спасибо чета я не заметил, хотя смотрел долго и упорно ;) (авитаминоз наверное)

igrok-vip
Сообщения: 56
Зарегистрирован: 29 апр 2013, 11:53

Re: Урок 34. Хранение данных. SQLite

Сообщение igrok-vip » 17 май 2013, 13:29

Не нашёл в уроках что-то ответа на такой лёгкий вопрос:
Если у определённой записи в колонке ничего нет, то такой запрос: String str = c.getString(c.getColumnIndex("name")) приводит к ошибке. Подозреваю, что нужно воспользоваться try, но не знаю как именно.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 34. Хранение данных. SQLite

Сообщение Mikhail_dev » 17 май 2013, 13:46

try {
String str = c.getString(c.getColumnIndex("name"))
} catch (Exception e) {
Log.d("myException", "ошибка", e);
}
Настоятельно советую почитать про исключения такой учебник, как "Java 2. Том 1. Основы - Хорстманн, Корнелл", там граммотно написано про исключение. Если они будут сложны в понимании, то стоит там же почитать про наследование классов. К примеру Exception это суперкласс для всех исключений. Так делать как я, не всегда есть хорошо

igrok-vip
Сообщения: 56
Зарегистрирован: 29 апр 2013, 11:53

Re: Урок 34. Хранение данных. SQLite

Сообщение igrok-vip » 17 май 2013, 14:57

Делал почти так же, только вместо Exception ставил IndexOutOfBoundsException, то что пишется в лог при ошибке. Но эти два способа не помогают, всё равно ошибка. А если эту колонку не трогать то всё норм и до удаления из этой колонки записи тоже всё норм.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 34. Хранение данных. SQLite

Сообщение Mikhail_dev » 17 май 2013, 14:59

Открываем DDMS, смотрим стектрейс ошибки и выкладываем сюда, потому что ошибка не в этой строке, раз проблема не ушла, либо она порождает другую ошибку.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 34. Хранение данных. SQLite

Сообщение Foenix » 17 май 2013, 16:53

igrok-vip писал(а):Делал почти так же, только вместо Exception ставил IndexOutOfBoundsException, то что пишется в лог при ошибке. Но эти два способа не помогают, всё равно ошибка. А если эту колонку не трогать то всё норм и до удаления из этой колонки записи тоже всё норм.
Конечно, ошибка останется, она ведь не обработана. Трай- это лишь способ ее ухватить.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

igrok-vip
Сообщения: 56
Зарегистрирован: 29 апр 2013, 11:53

Re: Урок 34. Хранение данных. SQLite

Сообщение igrok-vip » 17 май 2013, 18:42

Да что-то другое у меня) Сейчас пустой проект создал и попробовал считать несуществующее значение. Даже без try ошибка не появляется. Буду разбираться. Всё равно спасибо за помощь

igrok-vip
Сообщения: 56
Зарегистрирован: 29 апр 2013, 11:53

Re: Урок 34. Хранение данных. SQLite

Сообщение igrok-vip » 01 июн 2013, 22:09

Подскажите пожалуйста, как хранить базу данных на карте памяти?
У меня есть класс DataBase
[syntax=java]
package com.example.test1;

import java.io.File;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;

public class DataBase extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "MyDB.db";
private static final int DATABASE_VERSION = 1;

public DataBase(Context context) {
// TODO Auto-generated constructor stub
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}


@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub

db.execSQL("create table MyTable ("
+ "_id integer primary key autoincrement,"
+ "column_1 integer,"
+ ");");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub

db.execSQL("DROP TABLE IF EXISTS MyTable");
onCreate(db);

}


}
[/syntax]

damager82 писал, что нужен метод

void prepareBD() {
File sdCard = Environment.getExternalStor ageDirectory();
File directory = new File(sdCard.getAbsolutePath () + "/MyDB");
directory.mkdirs();
File dbFile = new File(directory, "database");
SQLiteDatabase db = SQLiteDatabase.openOrCreateDat abase(dbFile, null);
db.execSQL("drop table if exists mytab;");
db.execSQL("create table mytab (id integer primary key autoincrement, name text);");
db.execSQL("insert into mytab (name) values ('test');");
db.close();
}

Но его добавление ничего не даёт. База так же создаётся в памяти телефона.
Что я не правильно делаю?

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 34. Хранение данных. SQLite

Сообщение klblk » 02 июн 2013, 08:01

мб не хватает android.permission.WRITE_EXTERNAL_STORAGE?

Ответить