Помогите понять метод запроса данных из таблицы

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Закрыто
Vinch
Сообщения: 15
Зарегистрирован: 31 июл 2014, 19:22

Помогите понять метод запроса данных из таблицы

Сообщение Vinch » 31 июл 2014, 19:39

С помощью множества уроков и информации сделал программу для работы с базой данных. Скорее всего, всё можно было сделать намного проще, но я новичок, до этого момента пользовался только поиском и уроками с этого сайта. У меня получилось добавить данные в таблицу, удалить и вывести. Но у меня не получается вывести данные конкретного столбца для определенной строки. Помогите разобраться, кому не трудно?

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

package com.example.aao;

import java.util.ArrayList;
import java.util.List;

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.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {
	
	TextView tvOut;
	final String LOG_TAG = "myLogs";
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tvOut = (TextView) findViewById(R.id.tvOut);
	
		
	}
	private void addToFacility() {
	 DBHelper db = new DBHelper(this, AppData.DATABASE_NAME, null, AppData.DATABASE_VERSION);
	 db.addFacility(new Facility("Первый объект", 13.8279, 32.2835, 17.5075));
	 Log.d(LOG_TAG, "добавлено");
	}
   private void deleteFacility() {
	     DBHelper db = new DBHelper(this, AppData.DATABASE_NAME, null, AppData.DATABASE_VERSION);
	     List<Facility> facilityList = db.getAllFacility();
	     int result = 0;
	     for(Facility facility : facilityList) {
	      if(facility.getId() == 2)
	       result = db.deleteFacility(facility);
	     }
	     if(result == 1)
	    	 Log.d(LOG_TAG, "запись успешно удалена");
	     else
	    	 Log.d(LOG_TAG, "при удалении произошла ошибка");
	    }
	    
	private void readFacility() {
	 DBHelper db = new DBHelper(this, AppData.DATABASE_NAME, null, AppData.DATABASE_VERSION);
	 List<Facility> facilityList = db.getAllFacility();
	 for(Facility facility : facilityList) {
		 Log.d(LOG_TAG, "ID = " + facility.getId() + " TITLE = " + facility.getTitle() + 
				 " LATITUDE = " + facility.getLatit() + " LONGITUDE = " + facility.getLongit() + 
				 " ZOOM = " + facility.getZoom());
	 }
	}

	 public void onClickAdd(View view) {
		  addToFacility();
	 }
	 public void onClickDel(View view) {
		  deleteFacility();
	 }
	 public void onClickRead(View view) {
		  readFacility();
	 }
	 
	public class AppData {
	
	 public final static int DATABASE_VERSION = 2;
	 public final static String DATABASE_NAME = "facilityDB.sqlite3";
	 public final static String TABLE_NAME = "facility";
	 public final static String COLUMN_ID = "_id";
	 public final static String COLUMN_TITLE = "title";
	 public final static String COLUMN_LATIT = "latit";
	 public final static String COLUMN_LONGIT = "longit";
	 public final static String COLUMN_ZOOM = "zoom";
	 
	
	}
	public class Facility {
		 private int id;
		 private String title;
		 private double latit;
		 private double longit;
		 private double zoom;
		 
		 public Facility() {
		 
		 }
		 
		 public Facility(String _title, double _latit, double _longit, double _zoom) {
		  title = _title;
		  latit = _latit;
		  longit = _longit;
		  zoom = _zoom;
		 }
		 
		 public Facility(int _id, String _title, double _latit, double _longit, double _zoom) {
		  id = _id;
		  title = _title;
		  latit = _latit;
		  longit = _longit;
		  zoom = _zoom;
		 }
		 
		 public void setId(int _id) {
		  id = _id;
		 }
		 
		 public void setTitle(String _title) {
		  title = _title;
		 }
		 
		 public void setLatit(double _latit) {
		  latit = _latit;
		 }
		 
		 public void setLongit(double _longit) {
			  longit = _longit;
			 }
		 
		 public void setZoom(double _zoom) {
			  zoom = _zoom;
			 }
			 
		 public int getId() { return id; }
		 
		 public String getTitle() { return title; }
		 
		 public double getLatit() { return latit; }
	
		 public double getLongit() { return longit; }
		 
		 public double getZoom() { return zoom; }
	}
	public class DBHelper extends SQLiteOpenHelper {
	
	 public DBHelper(Context context, String name, CursorFactory factory, int version) {
	  super(context, name, factory, version);
	 }
	
	
	
	 @Override
	 public void onCreate(SQLiteDatabase db) {
		  String createFacilityTable = "CREATE TABLE " + AppData.TABLE_NAME + " (" + AppData.COLUMN_ID +
		   " INTEGER PRIMARY KEY AUTOINCREMENT, " + AppData.COLUMN_TITLE + " TEXT NOT NULL, " +
		   AppData.COLUMN_LATIT + " DOUBLE NOT NULL, " + AppData.COLUMN_LONGIT + " DOUBLE NOT NULL, " + 
		   AppData.COLUMN_ZOOM + " DOUBLE NOT NULL)";
		  db.execSQL(createFacilityTable);
		 }
	
	 @Override
	 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
	  if(AppData.DATABASE_VERSION < newVersion) {
	   db.execSQL("DROP TABLE IF EXISTS " + AppData.TABLE_NAME);
	   onCreate(db);
	  }
	 }



	public List<Facility> getAllFacility() {
	  List<Facility> facilityList = new ArrayList<Facility>();
	  String query = "SELECT * FROM " + AppData.TABLE_NAME;
	  SQLiteDatabase db = this.getReadableDatabase();
	  Cursor cursor = db.rawQuery(query, null);
	  if(cursor.moveToFirst()) {
	   do {
	    Facility facility = new Facility();
	    facility.setId(Integer.parseInt(cursor.getString(0)));
	    facility.setTitle(cursor.getString(1));
	    facility.setLatit(Double.parseDouble(cursor.getString(2)));
	    facility.setLongit(Double.parseDouble(cursor.getString(3)));
	    facility.setZoom(Double.parseDouble(cursor.getString(4)));
	    facilityList.add(facility);
	   } while(cursor.moveToNext());
	  }
	  return facilityList;
	 }



	public void addFacility(Facility facility) {
	  SQLiteDatabase db = this.getWritableDatabase();
	  ContentValues cv = new ContentValues();
	  cv.put(AppData.COLUMN_TITLE, facility.getTitle());
	  cv.put(AppData.COLUMN_LATIT, facility.getLatit());
	  cv.put(AppData.COLUMN_LONGIT, facility.getLongit());
	  cv.put(AppData.COLUMN_ZOOM, facility.getZoom());
	  db.insert(AppData.TABLE_NAME, null, cv);
	  db.close();
	 }



	public Facility getFacility(int id) {
	  SQLiteDatabase db = this.getReadableDatabase();
	  Cursor cursor = db.query(AppData.TABLE_NAME, new String[] { AppData.COLUMN_ID, AppData.COLUMN_TITLE, AppData.COLUMN_LATIT , AppData.COLUMN_LONGIT, AppData.COLUMN_ZOOM },
	    AppData.COLUMN_ID + "=?", new String[] { String.valueOf(id) }, null, null, null);
	  if(cursor != null)
	   cursor.moveToFirst();
	  Facility facility = new Facility(Integer.parseInt(cursor.getString(0)), cursor.getString(1), Double.parseDouble(cursor.getString(2)), Double.parseDouble(cursor.getString(3)), Double.parseDouble(cursor.getString(4)));
	  return facility;
	 }



	public int updateFacility(Facility facility) {
	  SQLiteDatabase db = this.getWritableDatabase();
	  ContentValues cv = new ContentValues();
	  cv.put(AppData.COLUMN_TITLE, facility.getTitle());
	  cv.put(AppData.COLUMN_LATIT, facility.getLatit());
	  cv.put(AppData.COLUMN_LONGIT, facility.getLongit());
	  cv.put(AppData.COLUMN_ZOOM, facility.getZoom());
	  return db.update(AppData.TABLE_NAME, cv, AppData.COLUMN_ID + "=?", new String[] { String.valueOf(facility.getId()) });
	 }



	public int deleteFacility(Facility facility) {
	  SQLiteDatabase db = this.getWritableDatabase();
	  return db.delete(AppData.TABLE_NAME, AppData.COLUMN_ID + "=?", new String[] { String.valueOf(facility.getId()) });
	 }



	public int getFacilityCount() {
	  String query = "SELECT * FROM " + AppData.TABLE_NAME;
	  SQLiteDatabase db = this.getReadableDatabase();
	  Cursor cursor = db.rawQuery(query, null);
	  cursor.close();
	  return cursor.getCount();
	 }



	public Cursor getAllCursor() {
	  SQLiteDatabase db = this.getReadableDatabase();
	  return db.query(AppData.TABLE_NAME, null, null, null, null, null, null);
	 }
	
	}

}


парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

Re: Помогите понять метод запроса данных из таблицы

Сообщение парень » 31 июл 2014, 23:06

Код посмотрел крайне бегло...

Что не получается то?
String query = "SELECT * FROM " + AppData.TABLE_NAME; - вот запрос. Вместо * можно указать название столбца... Если нужно значение допустим в столбце name, строки в которой age(другой столбец) равен 18...

String query="SELECT name FROM tablename WHERE age=18";
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

Vinch
Сообщения: 15
Зарегистрирован: 31 июл 2014, 19:22

Re: Помогите понять метод запроса данных из таблицы

Сообщение Vinch » 01 авг 2014, 06:07

Спасибо, я не совсем понимал, sql запрос, теперь все более чем понятно.

Vinch
Сообщения: 15
Зарегистрирован: 31 июл 2014, 19:22

Re: Помогите понять метод запроса данных из таблицы

Сообщение Vinch » 01 авг 2014, 16:47

А как отправить этот запрос?

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

Re: Помогите понять метод запроса данных из таблицы

Сообщение парень » 01 авг 2014, 18:54

String query="SELECT name FROM tablename WHERE age=18";
Cursor cursor = db.rawQuery(query, null);

в курсоре будет хранится значения только столбца "name" где "age"=18.

Вы используете "cursor.getString(0)" для получения значения, я использую так - cursor.getString(cursor.getColumnIndex("name"));
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

Vinch
Сообщения: 15
Зарегистрирован: 31 июл 2014, 19:22

Re: Помогите понять метод запроса данных из таблицы

Сообщение Vinch » 01 авг 2014, 21:33

Пытаюсь вот так сделать

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

	public String fM(String tableName, int id) {
		String str = "";
		SQLiteDatabase db = this.getReadableDatabase();
		 String query = "SELECT " + AppData.COLUMN_TITLE + " FROM " + tableName +" WHERE " + AppData.COLUMN_ID + " = "+ id;
		  Cursor cursor = db.rawQuery(query, null);
	    if (cursor.moveToFirst()) {
	      str = cursor.getString(id);
	      return str;
	    }
	}
Выдаёт ошибку: This method must return a result of type String

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

Re: Помогите понять метод запроса данных из таблицы

Сообщение Foenix » 01 авг 2014, 21:43

ну тебе же сказали
cursor.getString(cursor.getColumnIndex("name"));
R.id.team

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

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

Re: Помогите понять метод запроса данных из таблицы

Сообщение парень » 02 авг 2014, 00:05

Vinch писал(а):Пытаюсь вот так сделать

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

	...
	      str = cursor.getString(id);
	     ...
Выдаёт ошибку: This method must return a result of type String
вместо id указать[syntax=java] cursor.getColumnIndex(название столбца данные которого Вам нужны)[/syntax]
В Вашем случае [syntax=java]str = cursor.getString(cursor.getColumnIndex(AppData.COLUMN_TITLE));[/syntax]
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

Vinch
Сообщения: 15
Зарегистрирован: 31 июл 2014, 19:22

Re: Помогите понять метод запроса данных из таблицы

Сообщение Vinch » 02 авг 2014, 08:30

Foenix писал(а):ну тебе же сказали
cursor.getString(cursor.getColumnIndex("name"));
Да я изначально так и делал, потом пробовать методом тыка начал, так и скопировал сюда.
А ошибка все равно никак не меняется,
и объясните мне если не трудно, getColumnIndex("name") как я думаю, возвращает номер столбца "name" или -1 если такого столбца не находит, и если это так то что изменится если я сразу укажу номер столбца?
(только в запросе например вот так сделать + AppData.COLUMN_ID + " = 3", а то id разные)

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

Re: Помогите понять метод запроса данных из таблицы

Сообщение Foenix » 02 авг 2014, 10:34

лучше вместо name в примере использовать константу как указали выше, она у тебя есть - AppData.COLUMN_ID
да, это просто номер столбца, однако 1) и главное - это правильный код 2) если ты поменяешь запрос через неделю уже не вспомнишь где у тебя это используется и будет ошибка.
такая штука в коде, как cursor.getString(0) - может тебя лишить работы, например.. это антипрограммирование какое-то
R.id.team

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

Vinch
Сообщения: 15
Зарегистрирован: 31 июл 2014, 19:22

Re: Помогите понять метод запроса данных из таблицы

Сообщение Vinch » 02 авг 2014, 11:45

Foenix писал(а):лучше вместо name в примере использовать константу как указали выше, она у тебя есть - AppData.COLUMN_ID
да, это просто номер столбца, однако 1) и главное - это правильный код 2) если ты поменяешь запрос через неделю уже не вспомнишь где у тебя это используется и будет ошибка.
такая штука в коде, как cursor.getString(0) - может тебя лишить работы, например.. это антипрограммирование какое-то
А что в итоге мне сделать, чтобы убрать ошибку: This method must return a result of type String???

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

Re: Помогите понять метод запроса данных из таблицы

Сообщение Foenix » 02 авг 2014, 14:03

ну ты сам посмотри на свой метод - если у тебя код не пойдет в if - что он вернет?
R.id.team

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

парень
Сообщения: 223
Зарегистрирован: 30 мар 2013, 22:52

Re: Помогите понять метод запроса данных из таблицы

Сообщение парень » 03 авг 2014, 09:02

Скажу попроще, если в базе не будет данных согласно твоего запроса, то у метода не будет возможности вернуть результат своего труда )))

[syntax=java5]public String fM(String tableName, int id) {
String str = "";
SQLiteDatabase db = this.getReadableDatabase();
String query = "SELECT " + AppData.COLUMN_TITLE + " FROM " + tableName +" WHERE " + AppData.COLUMN_ID + " = "+ id;
Cursor cursor = db.rawQuery(query, null);
if (cursor.moveToFirst()) {
str = cursor.getString(id);
return str;
}
return str;// - можно сделать так, тогда как минимум ошибки не будет...
} [/syntax]
Мой первенец: MyMoney. Менеджер расходов

Бьем рекорды русских топов :)

Могу ответить на любые вопросы по маркетингу и развитию.

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

Re: Помогите понять метод запроса данных из таблицы

Сообщение Foenix » 03 авг 2014, 11:27

Тим, не все такие как ты. Думаешь, если человеку не оставлять пространства для размышлений - он чему-то научится?
R.id.team

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

Vinch
Сообщения: 15
Зарегистрирован: 31 июл 2014, 19:22

Re: Помогите понять метод запроса данных из таблицы

Сообщение Vinch » 04 авг 2014, 15:44

Спасибо!

Закрыто