Код: Выделить всё
String region[] = { "Азия", "Америка", "Америка", "Европа", "Азия",
"Европа", "Африка", "Европа", "Европа", "Америка" };
Код: Выделить всё
String region[] = { "Азия", "Америка", "Америка", "Европа", "Азия",
"Европа", "Африка", "Европа", "Европа", "Америка" };
потому что нужно просто "count(*) as Count" (круглые скобки а не квадратные)Bolt писал(а):У меня чёт кнопка не робит)) Функции)
В чем проблема?
Он не видит запрос sql count[*] as Count. Остальные кнопки работают.
по одному значению на каждую запись в таблицеbetirsolt писал(а):я не пойму зачем тут повторы в регионах?Код: Выделить всё
String region[] = { "Азия", "Америка", "Америка", "Европа", "Азия", "Европа", "Африка", "Европа", "Европа", "Америка" };
Потому, что в конце этого метода подключение и база закрываются. И при каждом нажатии кнопки нужно заново открывать базу и в конце работы закрывать. Можно конечно оставить соединение висеть, но есть шанс, что что-то пойдёт не так, и когда мы попытаемся след раз обратится к базе через это соединение, то словим ошибку.Дмитрий Х. писал(а):public void onClick(View v) {
// подключаемся к базе
db = dbHelper.getWritableDatabase();
А зачем подключаться к БД каждый раз при нажатии на кнопку, а потом закрывать подключение? Разве того, что мы подключились в методе OnCreate не достаточно?
Это как раз и есть подключение к базе - "Create and/or open a database that will be used for reading and writing."Foenix писал(а):это не подключение.Дмитрий Х. писал(а):А что тогда, если не соединение с БД?Foenix писал(а):это не подключение.Foenix писал(а):http://developer.android.com/reference/ ... leDatabase()
метод возвращает в переменную сам объект(instance) бд для записи/чтения
Судя по документу - это нужно делать каждый раз перед записью/чтением из нее.
Код: Выделить всё
Cursor c = db.query("mytable", null, null, null, null, null, null);
Код: Выделить всё
package com.example.vladsalat.p0361_simplesqlitequery;
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.widget.*;
import static android.view.View.OnClickListener;
public class MainActivity extends Activity implements OnClickListener {
final String LOG_TAG = "myLogs";
String name[] = { "Китай", "США", "Бразилия", "Россия", "Япония",
"Германия", "Египет", "Италия", "Франция", "Канада" };
int people[] = { 1400, 311, 195, 142, 128, 82, 80, 60, 66, 35 };
String region[] = { "Азия", "Америка", "Америка", "Европа", "Азия",
"Европа", "Африка", "Европа", "Европа", "Америка" };
Button btnAll, btnFunc, btnPeople, btnSort, btnGroup, btnHaving;
EditText etFunc, etPeople, etRegionPeople;
RadioGroup rgSort;
DBHelper dbHelper;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnAll = (Button) findViewById(R.id.btnAll);
btnAll.setOnClickListener(this);
btnFunc = (Button) findViewById(R.id.btnFunc);
btnFunc.setOnClickListener(this);
btnPeople = (Button) findViewById(R.id.btnPeople);
btnPeople.setOnClickListener(this);
btnSort = (Button) findViewById(R.id.btnSort);
btnSort.setOnClickListener(this);
btnGroup = (Button) findViewById(R.id.btnGroup);
btnGroup.setOnClickListener(this);
btnHaving = (Button) findViewById(R.id.btnHaving);
btnHaving.setOnClickListener(this);
etFunc = (EditText) findViewById(R.id.etFunc);
etPeople = (EditText) findViewById(R.id.etPeople);
etRegionPeople = (EditText) findViewById(R.id.etRegionPeople);
rgSort = (RadioGroup) findViewById(R.id.rgSort);
dbHelper = new DBHelper(this);
//подключаемся к базе данных
db = dbHelper.getWritableDatabase();
Cursor c = db.query("mytable", null, null, null, null, null, null);
if (c.getCount() == 0){
ContentValues cv = new ContentValues();
for (int i = 0; i<10;i++){
cv.put("name", name[i]);
cv.put("people", people[i]);
cv.put("region", region[i]);
Log.d(LOG_TAG, "id = " + db.insert("mytable", null, cv));
}
}
c.close();
dbHelper.close();
// эмулируем нажатие кнопки btnAll
onClick(btnAll);
}
@Override
public void onClick(View v) {
//подключаемся к базе
db = dbHelper.getWritableDatabase();
//данные с экрана
String sFunc = etFunc.getText().toString();
String sPeople = etPeople.getText().toString();
String sRegionPeople = etRegionPeople.getText().toString();
//переменные для query
String[] columns = null;
String selection = null;
String[] selectionArgs = null;
String groupBy = null;
String having = null;
String orderBy = null;
//курсор
Cursor c = null;
// определяем нажатую кнопку
switch (v.getId()){
//все записи
case R.id.btnAll:
Log.d(LOG_TAG,"---Все записи---");
c = db.query("mytable", null,null,null,null,null,null);
break;
//функция
case R.id.btnFunc:
Log.d(LOG_TAG, "---функция " + sFunc + "---");
columns = new String[]{sFunc};
c = db.query("mytable", columns, null,null,null,null,null);
break;
// население больше, чем
case R.id.btnPeople:
Log.d(LOG_TAG, "---население больше" + sPeople + "---" );
selection = "people > ?";
selectionArgs = new String[]{sPeople};
c = db.query("mytable", null, selection, selectionArgs, null,null,null);
break;
//население по региону
case R.id.btnGroup:
Log.d(LOG_TAG, "---население по региону---");
columns = new String[]{"region" + "sum(people) as people"};
groupBy = "region";
c = db.query("mytable",columns, null, null, groupBy, null,null);
break;
//население о региону больше чем
case R.id.btnHaving:
Log.d(LOG_TAG, "---Регионы с населением больше чем " + sRegionPeople + "---");
columns = new String[]{"region", "sum(people) as people"};
groupBy = "region";
having = "sum(people) > " + sRegionPeople;
c = db.query("mytable", null,null, columns, groupBy, having, null);
break;
//сортировка
case R.id.btnSort:
//сортировка по
switch (rgSort.getCheckedRadioButtonId()){
//наименование
case R.id.rName:
Log.d(LOG_TAG, "---сортировка по имени---");
orderBy = "name";
break;
case R.id.rPeople:
Log.d(LOG_TAG, "---сортировка по населению---");
orderBy = "people";
break;
case R.id.rRegion:
Log.d(LOG_TAG, "---сортировка по региону---");
orderBy = "region";
break;
}
c = db.query("mytable", null, null, null, null, null, orderBy);
break;
}
if (c != null){
if (c.moveToFirst()){
String str;
do {
str = "";
for (String cn : c.getColumnNames()){
str = str.concat(cn + " = " + c.getString(c.getColumnIndex(cn)) + "; ");
}
Log.d(LOG_TAG, str);
}while (c.moveToNext());
}
c.close();
}
else Log.d(LOG_TAG, "Cursor is null");
dbHelper.close();
}
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," + "name text,"
+ "people integer," + "region text" + ");");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}
Логи и код в студию.vladsalat93 писал(а):выкидует NPL на строку в онкриейт с таким содержанием.как так? =(Код: Выделить всё
Cursor c = db.query("mytable", null, null, null, null, null, null);
doter.ua писал(а):Логи и код в студию.vladsalat93 писал(а):выкидует NPL на строку в онкриейт с таким содержанием.как так? =(Код: Выделить всё
Cursor c = db.query("mytable", null, null, null, null, null, null);
Код: Выделить всё
03-09 13:42:16.335 1129-1129/com.example.vladsalat.p0361_simplesqlitequery D/AndroidRuntime﹕ Shutting down VM
03-09 13:42:16.335 1129-1129/com.example.vladsalat.p0361_simplesqlitequery W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xb3a55ba8)
03-09 13:42:16.385 1129-1129/com.example.vladsalat.p0361_simplesqlitequery E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.vladsalat.p0361_simplesqlitequery, PID: 1129
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.vladsalat.p0361_simplesqlitequery/com.example.vladsalat.p0361_simplesqlitequery.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.example.vladsalat.p0361_simplesqlitequery.MainActivity.onCreate(MainActivity.java:67)
at android.app.Activity.performCreate(Activity.java:5231)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
03-09 13:42:23.815 1129-1129/com.example.vladsalat.p0361_simplesqlitequery I/Process﹕ Sending signal. PID: 1129 SIG: 9
03-09 13:48:59.695 1209-1209/com.example.vladsalat.p0361_simplesqlitequery D/AndroidRuntime﹕ Shutting down VM
03-09 13:48:59.695 1209-1209/com.example.vladsalat.p0361_simplesqlitequery W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xb3a55ba8)
03-09 13:48:59.725 1209-1209/com.example.vladsalat.p0361_simplesqlitequery E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.vladsalat.p0361_simplesqlitequery, PID: 1209
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.vladsalat.p0361_simplesqlitequery/com.example.vladsalat.p0361_simplesqlitequery.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.example.vladsalat.p0361_simplesqlitequery.MainActivity.onCreate(MainActivity.java:67)
at android.app.Activity.performCreate(Activity.java:5231)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
03-09 13:49:19.335 1209-1209/com.example.vladsalat.p0361_simplesqlitequery I/Process﹕ Sending signal. PID: 1209 SIG: 9
doter.ua писал(а):Вроде все норм, попробуй переустановить приложение (БД создается при установке приложения, при следующем запуске она уже существует) может дело в ней. Вручную удали приложение на девайсе\эмуляторе.
Ну это когда уже релиз был и выбора нет, а так лучше грохнуть приложение)Foenix писал(а):версию бд надо было менять
stskr писал(а):Есть ли какой-то инструментарий, который позволяет напрямую написать запрос к базе SQLite?
Когда пишешь запрос через методы класса не очень понятно, какой запрос на выходе получается.
(Соответственно, будет сложно найти ошибку в таком запросе.)
Код: Выделить всё
String query = "SELECT * FROM my_table";
Cursor c = db.rawQuery(query, null);
if (c != null && c.moveToFirst()) {
// todo
}
Foenix писал(а):какие логи, где, для какого показа?