Страница 1 из 1

Несколько активити и одна бд

Добавлено: 13 окт 2013, 17:07
babygluk
И так
У меня есть бд

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

package com.example.tamagochi;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class IStorage {
 
	private DBHelper dbHelper;
	private SQLiteDatabase db;
	private ContentValues cv;
	 
	
	 
	IStorage(Context context){

		this.dbHelper = new DBHelper(context);
		   // подключаемся к БД
		this.db = dbHelper.getWritableDatabase();
		// создаем объект для данных
	    this.cv = new ContentValues();
	}
	
	public void Save(MTamagochi tamagochi){
		 // создаем объект для данных
		db.delete("tamagochi", null, null);
		 
	    cv = new ContentValues();
	    cv.put("name", tamagochi.getName());
	    cv.put("age", tamagochi.getAge());
	    cv.put("healthy", tamagochi.getHealthy());
	    cv.put("hangry", tamagochi.getHangry());
	    cv.put("energy", tamagochi.getEnergy());
	    cv.put("money", tamagochi.getMoney());
	    cv.put("exp", tamagochi.getExp());
	    cv.put("img", tamagochi.getImgUrl());
	    cv.put("clean", tamagochi.getClean());
	    db.insert("tamagochi", null, cv);
	    cv.clear();
	}

	public void load(MTamagochi aTamagochi){
		
		// делаем запрос всех данных из таблицы mytable, получаем Cursor 
	      Cursor c = db.query("tamagochi", null, null, null, null, null, null);
	      if (c.moveToFirst()) {	    	  
	          // определяем номера столбцов по имени в выборке
	          int nameColIndex = c.getColumnIndex("name");
	          int ageColIndex = c.getColumnIndex("age");
	          int healthyColIndex = c.getColumnIndex("healthy");
	          int hangryColIndex = c.getColumnIndex("hangry");
	          int energyColIndex = c.getColumnIndex("energy");
	          int moneyColIndex = c.getColumnIndex("money");
	          int expColIndex = c.getColumnIndex("exp");
	          int imgColIndex = c.getColumnIndex("img");
	          int CleanColIndex = c.getColumnIndex("clean");
	          do {
	            // получаем значения по номерам столбцов и пишем все в..
	        	  aTamagochi.setName(c.getString(nameColIndex));
	        	  aTamagochi.setAge(c.getInt(ageColIndex));
	        	  aTamagochi.setHealthy(c.getInt(healthyColIndex));
	        	  aTamagochi.setHangry(c.getInt(hangryColIndex));
	        	  aTamagochi.setEnergy(c.getInt(energyColIndex));
	        	  aTamagochi.setMoney(c.getInt(moneyColIndex));
	        	  aTamagochi.setExp(c.getInt(expColIndex));
	        	  aTamagochi.setImgUrl(imgColIndex);
	        	  aTamagochi.setClean(CleanColIndex);
	           
	            // переход на следующую строку 
	            // а если следующей нет (текущая - последняя), то false - выходим из цикла
	          } while (c.moveToNext());
	        } else
	        c.close();
		
	}

	public void Save(MFoods food){
		 // создаем объект для данных
	    ContentValues cv = new ContentValues();	    
	    cv.put("name", food.getName());
	    cv.put("count", food.getCount());
	    cv.put("hangry", food.getHangry());
	    cv.put("energy", food.getEnergy());
	    cv.put("cost", food.getCost());
	    cv.put("exp", food.getExp());
	    cv.put("img", food.getUrlImg());
	    cv.put("eatAge", food.getEatAge());
	    
	    db.insert("tamagochi", null, cv);
	    cv.clear();
	}
	public void load(MFoods food){
		// делаем запрос всех данных из таблицы mytable, получаем Cursor 
	      Cursor c = db.query("foods", null, null, null, null, null, null);
	      if (c.moveToFirst()) {	    	  
	          // определяем номера столбцов по имени в выборке
	          int idColIndex = c.getColumnIndex("id");
	          int nameColIndex = c.getColumnIndex("name");
	          int countColIndex = c.getColumnIndex("count");
	          int hangryColIndex = c.getColumnIndex("hangry");
	          int energyColIndex = c.getColumnIndex("energy");
	          int costColIndex = c.getColumnIndex("cost");
	          int expColIndex = c.getColumnIndex("exp");
	          int imgColIndex = c.getColumnIndex("img");
	          int eatAgeColIndex = c.getColumnIndex("eatAge");

	          do {
	            // получаем значения по номерам столбцов и пишем все в..
	        	  food.set("name", c.getString(nameColIndex));
	        	  food.set("count", c.getString(countColIndex));
	        	  food.set("hangry", c.getString(hangryColIndex));
	        	  food.set("energy", c.getString(energyColIndex));
	        	  food.set("cost", c.getString(costColIndex));
	        	  food.set("exp", c.getString(expColIndex));
	        	  food.set("img", c.getString(imgColIndex));
	        	  food.set("eatAge", c.getString(eatAgeColIndex));
	        	  
	            // переход на следующую строку 
	            // а если следующей нет (текущая - последняя), то false - выходим из цикла
	          } while (c.moveToNext());
	        } else
	        c.close();
	}
	
	public void Save(MToilet toilet){}
	public void load(MToilet toilet){}
	
	public void Save(MSand sand){}
	public void load(MSand sand){}
	
}

class DBHelper extends SQLiteOpenHelper {

    public DBHelper(Context context) {
      super(context, "TAMAGOCHI_DB", null, 1);
    }

    @Override
	public void onCreate(SQLiteDatabase db) {

		db.execSQL("create table tamagochi ("
		          + "id integer primary key autoincrement," 
		          + "name text,"
		          + "age int null,"
		          + "healthy int null,"
		          + "hangry int null,"
		          + "energy int null,"
		          + "money int null,"
		          + "exp int null,"
		          + "img int null"
		          + ");");
		
		
		db.execSQL("create table foods ("
		          + "id integer primary key autoincrement," 
		          + "name text,"
		          + "count int null,"
		          + "energy int null,"
		          + "hangry int null,"
		          + "cost int null,"
		          + "exp int null,"
		          + "img int null,"
		          + "eatAge int null"
		          + ");");
	}


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

    }
  }


в MainActivity

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

IStorage storage = new IStorage(this);
t = new MTamagochi("pentr");
        t.setAge(3);
        storage.Save(t);
        storage.load(t);

делал и так

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

public static IStorage storage;

мой 2 активити

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

 MTamagochi ta = new MTamagochi("");
//IStorate storate = new IStorate(this);
		MainActivity.storage.load(ta);
		Toast.makeText(this,""+ta.getExp(), Toast.LENGTH_SHORT).show();
выводит 0. хотя данные есть.
Как можно получить contex первого активити, или как использувать одну бд во всех активити.

Re: Несколько активити и одна бд

Добавлено: 13 окт 2013, 17:48
rezak90
каждый раз открывать и закрывать или же сделать объект как синглтон

Re: Несколько активити и одна бд

Добавлено: 13 окт 2013, 17:49
trew
Попробуйте использовать Log внутри классов, чтобы найти ошибку. Как использовать Log, показано в уроке 34:
http://startandroid.ru/ru/uroki/vse-uroki-spiskom
В начале класса объявляется переменная
final String LOG_TAG = "myLogs";

а в коде:
Log.d(LOG_TAG, "--- Insert in mytable: ---");
И смотрите закладку LogCat, в eclipce.

Как получить context первого активити? Для этого нужно:
public class IStorage {
private final Context myContext;

и в конструкторе
IStorage(Context context){
...
myContext = context;
}

Re: Несколько активити и одна бд

Добавлено: 13 окт 2013, 18:35
babygluk
rezak90 писал(а):каждый раз открыватьи закрывать или же сделать объект как синглтон
подскажите пожалуйста как)))

Re: Несколько активити и одна бд

Добавлено: 13 окт 2013, 18:54
rezak90
babygluk писал(а):
rezak90 писал(а):каждый раз открыватьи закрывать или же сделать объект как синглтон
подскажите пожалуйста как)))
во второй активти открывать и закрывать бд так же как и в первой

Re: Несколько активити и одна бд

Добавлено: 13 окт 2013, 18:58
babygluk
rezak90 писал(а):
babygluk писал(а):
rezak90 писал(а):каждый раз открыватьи закрывать или же сделать объект как синглтон
подскажите пожалуйста как)))
во второй активти открывать и закрывать бд так же как и в первой

Активити 2

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

ta = new MTamagochi("Vasia");
	 
		IStorage storage = new IStorage(this);
		storage.load(ta);
		Toast.makeText(this,""+ta.getExp(), Toast.LENGTH_SHORT).show();
Выводит 0
а в 1 активити выводит 300 =(

я так понял когда я создаю екземпляр то это я открываю бд.
а как закрывать? null присвоить?

Re: Несколько активити и одна бд

Добавлено: 13 окт 2013, 20:11
Foenix
Закрывать базу данных надо при выходе из приложения.

Re: Несколько активити и одна бд

Добавлено: 14 окт 2013, 11:07
babygluk
ахах ребята))) оказалось все еще лучше)))
оно даже в главном активити не отображает данные.
Может быть я написал кривой sql в бд?

попробовал создать тестовый клас и попробовать еще раз по мануалу.. не вышло

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

package com.example.tamagochi;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class TEST_DB extends SQLiteOpenHelper {
	static final String dbName="tamagochiDB";
	 static final String tamTable ="tamagochi";
	 static final String foodTable ="foods";
 
	 
	public TEST_DB(Context context){
		super(context, dbName, null,1);
	}
	
	public void Save(MTamagochi tamagochi){ 
        // создаем объект для данных 
		SQLiteDatabase db=this.getWritableDatabase();
		ContentValues cv=new ContentValues(); 
	   cv.put("_id", 1);
       cv.put("name", tamagochi.getName()); 
       cv.put("age", tamagochi.getAge()); 
       cv.put("healthy", tamagochi.getHealthy()); 
       cv.put("hangry", tamagochi.getHangry()); 
       cv.put("energy", tamagochi.getEnergy()); 
       cv.put("money", tamagochi.getMoney()); 
       cv.put("exp", tamagochi.getExp()); 
       cv.put("img", tamagochi.getImgUrl()); 
       cv.put("clean", tamagochi.getClean()); 
       db.insert("tamagochi", "_id", cv); 
 
       db.close();
   } 
	
	public void load(MTamagochi aTamagochi){ 
		SQLiteDatabase db=this.getWritableDatabase();
        // делаем запрос всех данных из таблицы mytable, получаем Cursor  
          Cursor c = db.query("tamagochi", null, null, null, null, null, null); 
          if (c.moveToFirst()) {               
              // определяем номера столбцов по имени в выборке 
              int nameColIndex = c.getColumnIndex("name"); 
              int ageColIndex = c.getColumnIndex("age"); 
              int healthyColIndex = c.getColumnIndex("healthy"); 
              int hangryColIndex = c.getColumnIndex("hangry"); 
              int energyColIndex = c.getColumnIndex("energy"); 
              int moneyColIndex = c.getColumnIndex("money"); 
              int expColIndex = c.getColumnIndex("exp"); 
              int imgColIndex = c.getColumnIndex("img"); 
              int CleanColIndex = c.getColumnIndex("clean"); 
              do { 
                // получаем значения по номерам столбцов и пишем все в.. 
                  aTamagochi.setName(c.getString(nameColIndex)); 
                  aTamagochi.setAge(c.getInt(ageColIndex)); 
                  aTamagochi.setHealthy(c.getInt(healthyColIndex)); 
                  aTamagochi.setHangry(c.getInt(hangryColIndex)); 
                  aTamagochi.setEnergy(c.getInt(energyColIndex)); 
                  aTamagochi.setMoney(c.getInt(moneyColIndex)); 
                  aTamagochi.setExp(c.getInt(expColIndex)); 
                  aTamagochi.setImgUrl(imgColIndex); 
                  aTamagochi.setClean(CleanColIndex); 
                
                // переход на следующую строку  
                // а если следующей нет (текущая - последняя), то false - выходим из цикла 
              } while (c.moveToNext()); 
            } else 
            c.close(); 
          db.close();
         
    } 
	@Override
	public void onCreate(SQLiteDatabase db) {
 
		
		db.execSQL("CREATE TABLE "+tamTable+
		        " ("+"_id"+" INTEGER PRIMARY KEY AUTOINCREMENT, "+
		        "name"+" TEXT, "+"age"+" INTEGER, "+"healthy"+" INTEGER,"+
		        "hangry"+" INTEGER, "+"energy"+" INTEGER, "+"money"+" INTEGER,"+
		        "exp"+" INTEGER"+
		        ");");
		
	}


	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		db.execSQL("DROP TABLE IF EXISTS tamagochi"); 
		onCreate(db);
	}
	
}

Re: Несколько активити и одна бд

Добавлено: 14 окт 2013, 13:15
Foenix
классы уже выглядят получше. Но куда ты "выводишь" я не поняла. В список листвью?

Re: Несколько активити и одна бд

Добавлено: 14 окт 2013, 14:48
babygluk
Foenix писал(а):классы уже выглядят получше. Но куда ты "выводишь" я не поняла. В список листвью?
это как бы я хочу сделать сохранения для игры, но пока хотя бы на уровне одного объекта)
когда мне нужно сохранить в базу я вызываю storage.save(tamagochi);
а когда с базы загрузить объект, то storage.load(tamagochi);
и в моего tamagoci загружаются данные с полей таблицы.

чесно,я это все делаю не уверено, так как с этим всем знаком меньше недели)
я буду рад если сможете помочь решить проблему.

Re: Несколько активити и одна бд

Добавлено: 14 окт 2013, 15:41
Foenix
так я и не поняла - куда же они "загружаются"? т.е. где хотите отобразить-то?
Почитайте уроки по базам данных тут, в большинстве случаев не нужно все данные из таблицы куда-то загонять в какие-то переменные-массивы, по-умолчанию запрос возвращается ввиде курсора, нужно сразу потом брать этот курсор, устанавливать текущую запись на первую и отображать данные прямо оттуда. Это все в уроках есть (буквально 2-3 первые урока по этой теме достаточно чтобы сообразить).

Re: Несколько активити и одна бд

Добавлено: 14 окт 2013, 17:32
babygluk
а как тогда лучше хранить объекты? сохранять и восстанавливать их??
на данный момент мне нужно только это)

Re: Несколько активити и одна бд

Добавлено: 14 окт 2013, 17:52
Foenix
Да данные у тебя совершенно правильно хранятся, в базе данных. Если это какие-то одиночные данные простого типа, то можно в файлах ресурсов хранить Preferences.

Re: Несколько активити и одна бд

Добавлено: 14 окт 2013, 18:01
babygluk
Foenix писал(а):Да данные у тебя совершенно правильно хранятся, в базе данных. Если это какие-то одиночные данные простого типа, то можно в файлах ресурсов хранить Preferences.
Нашел и исправил ошибки))
Действительно Вася я.. не смотрел логи, а потом глянул и увидел что ошибка в запросе)

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

String queryTamagochi ="CREATE TABLE tamagochi IF TABLE NOT EXIST (name TEXT, age INTEGER, healthy INTEGER, hangry INTEGER, energy INTEGER, money INTEGER, exp INTEGER, img INTEGER, clean INTEGER) ";
		
теперь все нормально)
спасибо =)