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

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

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

Сообщение Foenix » 28 июн 2013, 17:27

Не нужно так делать. Просто запусти разок программку (в которой по уроку уже создана структура), скопируй себе файл базы данных в любое место, открой его любым sqlite менеджером, наполни данными и закачай обратно.
Для тестирования - сойдет.
МОжно еще сделать так, чтоб эта база данных со 150 строчками устанавливалась вместе с приложением на любой телефон или что у вас там. Но там свои нюансы.
R.id.team

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

markizx
Сообщения: 1
Зарегистрирован: 01 июл 2013, 22:51

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

Сообщение markizx » 05 июл 2013, 12:04

db.execSQL(


// где про эти строки почитать?
"create table mytable ("
+ "id integer primary key autoincrement,"
+ "val text"
+ ");"


);

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

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

Сообщение Mikhail_dev » 05 июл 2013, 12:23

На экране их читать.
Можно поподробнее, в чем вопрос? Если узнать, что они означают, то это SQL язык.

antonbright
Сообщения: 56
Зарегистрирован: 24 июн 2013, 18:50

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

Сообщение antonbright » 10 июл 2013, 22:48

Помогите пожалуйста. Не могу найти ошибку

MainActivity

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

public class MainActivity extends Activity implements OnClickListener{

		CatsDataBase sqh;
		SQLiteDatabase sqdb;

		EditText txtData;

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

			txtData = (EditText) findViewById(R.id.txtData);

			// Инициализируем наш класс-обёртку
			sqh = new CatsDataBase(this);

			// База нам нужна для записи и чтения
			sqdb = sqh.getWritableDatabase();

		}

		public void onClick(View v) {
			Button buttonCVInsert = (Button) findViewById(R.id.buttonCVInsert);
			buttonCVInsert.setOnClickListener(this);
			Button buttonQuery = (Button) findViewById(R.id.buttonQuery);
			buttonQuery.setOnClickListener(this);
			EditText txtData = (EditText) findViewById(R.id.txtData);
			switch (v.getId()) {
			case R.id.buttonCVInsert:
				// Метод 1: INSERT через класс CONTENTVALUE
				ContentValues cv = new ContentValues();
				cv.put(CatsDataBase.CATNAME, txtData.getText().toString());
				// вызываем метод вставки
				sqdb.insert(CatsDataBase.TABLE_NAME, CatsDataBase.CATNAME, cv);
				txtData.setText("");
				break;
			
			case R.id.buttonQuery:
				Cursor cursor = sqdb.query(CatsDataBase.TABLE_NAME, new String[] {
						CatsDataBase._ID, CatsDataBase.CATNAME }, null, // The
																		// columns
																		// for the
																		// WHERE
																		// clause
						null, // The values for the WHERE clause
						null, // don't group the rows
						null, // don't filter by row groups
						null // The sort order
						);
				while (cursor.moveToNext()) {
					// GET COLUMN INDICES + VALUES OF THOSE COLUMNS
					int id = cursor.getInt(cursor.getColumnIndex(CatsDataBase._ID));
					String name = cursor.getString(cursor
							.getColumnIndex(CatsDataBase.CATNAME));
					Log.d("LOG_TAG", "ROW " + id + " HAS NAME " + name);
				}
				cursor.close();
				break;
		
			}
		}

		@Override
		protected void onStop() {
			// TODO Auto-generated method stub
			super.onStop();
			// закрываем соединения с базой данных
			sqdb.close();
			sqh.close();
		}

	}
CatDataBase

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

public class CatsDataBase extends SQLiteOpenHelper implements BaseColumns {

	private static final String DATABASE_NAME = "cat_database.db";
	private static final int DATABASE_VERSION = 1;
	public static final String TABLE_NAME = "contact_table";

	public static final String CATNAME = "catname";
	final String LOG_TAG = "myLogs";
	private static final String SQL_CREATE_ENTRIES = "CREATE TABLE "
			+ TABLE_NAME + " ("  + " INTEGER PRIMARY KEY AUTOINCREMENT,"
			+ CATNAME + ");";

	private static final String SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS "
			+ TABLE_NAME;

	public CatsDataBase(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(SQL_CREATE_ENTRIES);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		
		// Удаляем предыдущую таблицу при апгрейде
		db.execSQL(SQL_DELETE_ENTRIES);
		// Создаём новый экземпляр таблицы
		onCreate(db);
	}
}
123.jpg
123.jpg (41.94 КБ) 9583 просмотра

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

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

Сообщение KamiSempai » 10 июл 2013, 22:57

Вы перед INTEGER PRIMARY KEY забыли имя колонки написать.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

antonbright
Сообщения: 56
Зарегистрирован: 24 июн 2013, 18:50

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

Сообщение antonbright » 10 июл 2013, 23:21

234.jpg
234.jpg (39.37 КБ) 9579 просмотров
Спасибо.Исправил.Приложение запустилось но в бд не закидывает.Но в ддмс база создана, а в логе почему то не отображается

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

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

Сообщение Foenix » 11 июл 2013, 00:55

ну наверное версию бд нужно сменить на 2.
R.id.team

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

kost-nab
Сообщения: 2
Зарегистрирован: 28 июл 2013, 00:18

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

Сообщение kost-nab » 28 июл 2013, 00:55

Здравствуйте, у меня по каким-то причинам возникает ошибка при подключении к БД:

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

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

	myHelper mHelp; // наследник SQLiteOpenHelper
	SQLiteDatabase mDB; // собственно БД
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mHelp = new myHelper(this); // Нет проблем, Activity создаётся
	}
// Но как только нажимаю на кнопку - ВСЁ, стоп-машина. Видно даже по отладчику.
	public void DB_Clk(View v){
		mDB = mHelp.getWritableDatabase(); // Здесь!
	}

	public class myHelper extends SQLiteOpenHelper{

		public myHelper(Context context){
			super(context, "mydb", null, 1);
		}
		
		@Override
		public void onCreate(SQLiteDatabase db) {
			// TODO Auto-generated method stub
			db.execSQL("create table mytable {" +
					"_id integer primary key autoincrement, " +
					"name text, " +
					"email text);");
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			// TODO Auto-generated method stub
			
		}
		
	}
}
В отладчике возникает ошибка "Sourse not found".

Между тем, БД создана, в File Explorer она присутствует.

Заранее спасибо за помощь.

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

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

Сообщение rezak90 » 28 июл 2013, 01:23

kost-nab
повеселил перед сном
R.id.team
Политика на форуме запрещена

kost-nab
Сообщения: 2
Зарегистрирован: 28 июл 2013, 00:18

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

Сообщение kost-nab » 28 июл 2013, 06:19

Извините, я решил проблему.)))
Оказалось, что в константе текста команды создания таблицы (CREATE TABLE) отсутствовал пробел в строке-слагаемом "create teble", а нужно "create table ".

Недосмотрел. Бывает.
Другим будет уроком.

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

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

Сообщение Digetix » 09 авг 2013, 15:46

А как "забить" базу, если есть такой запрос из "интернет-базы" ?
[syntax=java]public void ParseQueryMap() {
query = new ParseQuery("MyObject");
query.findInBackground(new FindCallback() {
public void done(List<ParseObject> myObject, ParseException e) {
if (e == null) {
for ( int i = 0; i < myObject.size(); i++) {
stranaGet = myObject.get(i).getString("Country");
oblastGet = myObject.get(i).getString("District");
gorodGet = myObject.get(i).getString("City");
}
}
}
[/syntax]
Пробовал по примеру в уроке в этот код вставить
[syntax=java]
for ( int i = 0; i < myObject.size(); i++) {
stranaGet = myObject.get(i).getString("Country");
oblastGet = myObject.get(i).getString("District");
gorodGet = myObject.get(i).getString("City");

cv.put("name", stranaGet);
cv.put("email", oblastGet);
db.insert("mytable", null, cv);
}
[/syntax]
На выходе получаю только 50 записей.
Если добавляю ещё один столбец cv.put("first", gorodGet);, то на выходе вообще ничего нету. Приложение работает, но записей вообще никаких не вижу

nazi
Сообщения: 3
Зарегистрирован: 06 сен 2013, 06:29

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

Сообщение nazi » 06 сен 2013, 06:39

всем привет!
попыталась создать по аналогичному коду таблицу чуть больше, но все время выдает ошибку "Unfortunately, ... has stopped". по логам вижу, что не создается БД. Этот SQLite я не устанавливала на телефоне, как узнать, что он вообще есть? или может в коде какие ошибки?

package com.example.p0341_simplesqlite;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity implements OnClickListener {

final String LOG_TAG = "myLogs";

Button btnAdd, btnRead, btnClear;
EditText etTime, etFunc, etLine, etMach,
etTable, etZhou, etRight, etWrong, etStuff;

DBHelper dbHelper;

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

btnAdd = (Button) findViewById(R.id.btnAdd);
btnAdd.setOnClickListener(this);

btnRead = (Button) findViewById(R.id.btnRead);
btnRead.setOnClickListener(this);

btnClear = (Button) findViewById(R.id.btnClear);
btnClear.setOnClickListener(this);

etTime = (EditText) findViewById(R.id.etTime);
etFunc = (EditText) findViewById(R.id.etFunc);
etLine = (EditText) findViewById(R.id.etLine);
etMach = (EditText) findViewById(R.id.etMach);
etTable = (EditText) findViewById(R.id.etTable);
etZhou = (EditText) findViewById(R.id.etZhou);
etRight = (EditText) findViewById(R.id.etRight);
etWrong = (EditText) findViewById(R.id.etWrong);
etStuff = (EditText) findViewById(R.id.etStuff);


// создаем объект для создания и управления версиями БД
dbHelper = new DBHelper(this);
}


@Override
public void onClick(View v) {



// создаем объект для данных
ContentValues cv = new ContentValues();
Log.d(LOG_TAG, "создаем объект для данных");

// получаем данные из полей ввода
String Time1 = etTime.getText().toString();
String Func1 = etFunc.getText().toString();
String Line1 = etLine.getText().toString();
String Mach1 = etMach.getText().toString();
String Table1 = etTable.getText().toString();
String Zhou1 = etZhou.getText().toString();
String Right1 = etRight.getText().toString();
String Wrong1 = etWrong.getText().toString();
String Stuff1 = etStuff.getText().toString();

Log.d(LOG_TAG, "получаем данные из полей ввода");
// подключаемся к БД

SQLiteDatabase db = dbHelper.getWritableDatabase();
Log.d(LOG_TAG, "подключаемся к БД");


switch (v.getId()) {
case R.id.btnAdd:
Log.d(LOG_TAG, "--- Insert in mytable: ---");
// подготовим данные для вставки в виде пар: наименование столбца - значение
Log.d(LOG_TAG, "подготовим данные для вставки в виде пар: наименование столбца - значение");
cv.put("time", Time1);
cv.put("func", Func1);
cv.put("line", Line1);
cv.put("mach", Mach1);
cv.put("table", Table1);
cv.put("zhou", Zhou1);
cv.put("right", Right1);
cv.put("wrong", Wrong1);
cv.put("stuff", Stuff1);

// вставляем запись и получаем ее ID
long rowID = db.insert("mytable1", null, cv);
Log.d(LOG_TAG, "row inserted, ID = " + rowID);
break;
case R.id.btnRead:
Log.d(LOG_TAG, "--- Rows in mytable: ---");
// делаем запрос всех данных из таблицы mytable, получаем Cursor
Cursor c = db.query("mytable1", null, null, null, null, null, null);

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

// определяем номера столбцов по имени в выборке
int idColIndex = c.getColumnIndex("id");
int timeColIndex = c.getColumnIndex("time");
int funcColIndex = c.getColumnIndex("func");
int lineColIndex = c.getColumnIndex("line");
int machColIndex = c.getColumnIndex("mach");
int tableColIndex = c.getColumnIndex("table");
int zhouColIndex = c.getColumnIndex("zhou");
int rightColIndex = c.getColumnIndex("right");
int wrongColIndex = c.getColumnIndex("wrong");
int stuffColIndex = c.getColumnIndex("stuff");

do {
// получаем значения по номерам столбцов и пишем все в лог
Log.d(LOG_TAG,
"ID = " + c.getInt(idColIndex) +
",time = " + c.getString(timeColIndex) +
",func = " + c.getString(funcColIndex) +
",line = " + c.getString(lineColIndex) +
",mach = " + c.getString(machColIndex) +
",table = " + c.getString(tableColIndex) +
",zhou = " + c.getString(zhouColIndex) +
",right = " + c.getString(rightColIndex) +
",wrong = " + c.getString(wrongColIndex) +
",stuff = " + c.getString(stuffColIndex));
// переход на следующую строку
// а если следующей нет (текущая - последняя), то false - выходим из цикла
} while (c.moveToNext());
} else
Log.d(LOG_TAG, "0 rows");
c.close();
break;
case R.id.btnClear:
Log.d(LOG_TAG, "--- Clear mytable: ---");
// удаляем все записи
int clearCount = db.delete("mytable1", null, null);
Log.d(LOG_TAG, "deleted rows count = " + clearCount);
break;
}
// закрываем подключение к БД
dbHelper.close();
}



class DBHelper extends SQLiteOpenHelper {

public DBHelper(Context context) {
// конструктор суперкласса
super(context, "myDB1", null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
Log.d(LOG_TAG, "--- onCreate database ---");
// создаем таблицу с полями
db.execSQL("create table mytable1 ("
+ "id integer primary key autoincrement,"
+ "time text,"
+ "func text,"
+ "line text,"
+ "mach text,"
+ "table text,"
+ "zhou text,"
+ "right text,"
+ "wrong text,"
+ "stuff text);");

Log.d(LOG_TAG, "создаем таблицу с полями");

}

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

}
}

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

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

Сообщение KamiSempai » 06 сен 2013, 14:02

Без логов ничего конкретного не могу сказать.
Попробуйте удалить приложение с телефона и установить заново.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

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

Сообщение Foenix » 06 сен 2013, 23:18

создается бд или нет можно посмотреть не в логах, а в FileExplorer в папке data/data...
R.id.team

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

gerundii1
Сообщения: 7
Зарегистрирован: 20 сен 2013, 21:16

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

Сообщение gerundii1 » 22 сен 2013, 11:15

Появилась такая проблема...указал в DBHelper сначала неверный путь DB_PATH, запустил приложение - появилась ошибка что типо база не найдена и ее не открыть.. меняю DB_PATH на нужный и после этого получаю ошибку что не может выполниться запрос INSERT к таблице которая не существует..но база и таблица существует и если переустановить приложение с чисткой кешей то все работает отл..как программно выйти из положения?Подскажите плзз

На всякий случай прикрепляю DBHELPER

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

package linux.terminale;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper{
 
    private static String DB_PATH = "/data/data/package.name/databases/"; 
    private static String DB_NAME = "db.sqlite"; 
    private SQLiteDatabase myDataBase;  
    private final Context myContext;

    public DBHelper(Context context) {
    	super(context, DB_NAME, null, 1);
    	this.myContext = context;
    }	
 
    public void createDataBase() throws IOException{
 
    	boolean dbExist = checkDataBase();
    	if(dbExist){
       	}else{
    		this.getReadableDatabase();
 
        	try {
     			copyDataBase();
     		} catch (IOException e) {
     			throw new RuntimeException(e);
        	}
    	}
 
    }
 
    private boolean checkDataBase(){    	
    	File dbFile = new File(DB_PATH + DB_NAME);
           return dbFile.exists();
    }
 
    private void copyDataBase() throws IOException{
    	InputStream myInput = myContext.getAssets().open(DB_NAME);
    	String outFileName = DB_PATH + DB_NAME;
    	OutputStream myOutput = new FileOutputStream(outFileName);
    	byte[] buffer = new byte[1024];
    	int length;
    	while ((length = myInput.read(buffer))>0){
    		myOutput.write(buffer, 0, length);
    	}
 
    	myOutput.flush();
    	myOutput.close();
    	myInput.close(); 
    }
 
    public void openDataBase() throws SQLException{
    	String myPath = DB_PATH + DB_NAME;
    	myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
 
    }
 
    @Override
	public synchronized void close() {
 
    	    if(myDataBase != null)
    		    myDataBase.close();
 
    	    super.close();
 
	}
 
	@Override
	public void onCreate(SQLiteDatabase db) {
 
	}
 
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {		
	}
	
	
 
}

gross
Сообщения: 1
Зарегистрирован: 04 сен 2013, 08:25

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

Сообщение gross » 07 окт 2013, 12:25

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

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

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

Сообщение Foenix » 07 окт 2013, 13:14

откуда импортировать? 1 раз или в каждое приложение?
R.id.team

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

Norman
Сообщения: 5
Зарегистрирован: 24 июл 2013, 10:32

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

Сообщение Norman » 07 окт 2013, 16:27

Для чего нужен контекст в конструкторе SQLiteOpenHelper ? Верно ли я понимаю, что у каждого активити свой контекст? Возможно ли указать какой-либо универсальный контекст для работы с базой в синглтоне?

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

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

Сообщение anber » 07 окт 2013, 16:39

Norman писал(а):Для чего нужен контекст в конструкторе SQLiteOpenHelper ? Верно ли я понимаю, что у каждого активити свой контекст? Возможно ли указать какой-либо универсальный контекст для работы с базой в синглтоне?
У любой Activity или любого контекста есть метод getApplicationContext(), можно использовать его.
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

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

Сообщение Isaev » 16 окт 2013, 10:46

а каким образом onCreate в DBHelper срабатывает только если БД не существует?
По идее, при вызове

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

dbHelper = new DBHelper(this);
он уже должен отработать, разве нет?

Ответить