Задать вопрос
@M-Misha-M
горе-junior, программирую на C#, изучаю .Net

Как правильно вытащить информацию из БД Sqlite?

Здравствуйте! Пишу приложение "справочник грибов" . На главной активности у нас есть listview , и в зависимости от того, на какой гриб в списке мы кликнули запускаеться новое активити и выводиться его описание ( определяем по id). Описание грибов я наполнил через SqliteBrowser (поля: _id , mushroom) и в программе подлючаю Бд следующим образом:
package com.example.bd;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.BaseColumns;
import android.util.Log;

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


public class DataBaseHelper extends SQLiteOpenHelper implements BaseColumns {
private static String DB_PATH =  "/data/data/com.example.bd/databases/";
private static final String DB_NAME = "mushrooms.db";
    private SQLiteDatabase myDataBase;
    private  static final int DATABASE_VERSION = 1;
    private final Context myContext;
    public static final String TABLE_NAME = "mushrooms_table";


    DataBaseHelper(Context context) {

        super(context, DB_NAME, null, DATABASE_VERSION);
        this.myContext = context;
    }

    public void createDatabase() throws IOException {
        boolean dbexits = checkDataBase();
        if(dbexits) {



        }else {
            this.getReadableDatabase();

            try {
                copyDatabase();
            } catch (IOException e) {
                throw new Error("Error copying database");
            }
        }
    }


    private boolean checkDataBase(){
        SQLiteDatabase checkDB = null;

        try{
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
        }catch(SQLiteException e){

        }
        if(checkDB != null){
            checkDB.close();
        }
        return checkDB != null ? true : false;
    }


    private void copyDatabase() throws  IOException{
        Log.i("Database",
                "Новая база данных копируется на устройство!");
        int length;
        InputStream myInput = myContext.getAssets().open(DB_NAME);
        String outFileName = DB_PATH + DB_NAME;
        OutputStream myOutput = new FileOutputStream(outFileName);

        byte[] buffer = new byte[1024];

        while ((length = myInput.read(buffer))>0) {
            myOutput.write(buffer , 0 , length);
        }
        myOutput.flush();
        myOutput.close();
        myInput.close();
        Log.i("Database",
                "Новая база данных скопирована на устройство");
    }


    public void openDataBase() throws SQLException {


        String myPath  = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath , null , SQLiteDatabase.OPEN_READWRITE);

    }



    public synchronized void close() {

        if (myDataBase != null) {
            myDataBase.close();

        }
        super.close();
    }


    public void getInfromation(int id) {
        Information inf = new Information();
       myDataBase = this.getReadableDatabase();

        String selection = "_id = ?";
        String[] selectionArgs = new String[]{String.valueOf(id)};
        Cursor cursor = myDataBase.query(TABLE_NAME , null , selection , selectionArgs , null , null , null);

        try {
            if (cursor.moveToFirst()) inf.textView.setText(cursor.getColumnIndex("mushroom"));


        }finally {
            cursor.close();
        }

     myDataBase.close();
    }







   /* public Cursor getInfromation(int id) {
        String selection = "_id = ?";
        String[] selectionArgs = new String[]{String.valueOf(id)};

        return myDataBase.query(TABLE_NAME , null , selection , selectionArgs , null , null , null);
    }*/

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

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

    }
}

Вот в чем вопрос: видите метод getInformation? Этот метод делает выборку из БД чтобы определить на какой id мы нажали, но дело в том что если этот метод вызвать в активити, где будет выводиться описание, то оно вообще ничего не выведет в textView , скажите как правильно мне вывести информацию ( как исправить метод) ?
  • Вопрос задан
  • 2465 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
gadfi
@gadfi
https://gamega.org
cursor.getString(cursor.getColumnIndex("mushroom")

ох и намешали вы все до кучи ... опишите модели хотя бы не мучайтесь и самое главное void getInfromation(int id)
+ область видимости inf это метод getInfromation ... что и куда он должен вывести ?
Ответ написан
@onepavel
Консультация и разработка мобильных приложений
Что это такое Information inf = new Information(); ? Откуда берется inf.textView ?
Где и в каком потоке вызывается getInfromation ?
Вы уверены что в getInfromation id приходит верные для базы данных ?
Ответ написан
@M-Misha-M Автор вопроса
горе-junior, программирую на C#, изучаю .Net
Прошу прощения за то что не весь код выложил . Вот мои классы где я вызываю методы: create , open - в MainActivity, getInformation - в Information
MainActivity:
package com.example.bd;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;


public class MainActivity extends Activity {
    private DataBaseHelper db;
 int id = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        db = new DataBaseHelper(this);

        try {
            db.createDatabase();
        } catch (IOException e) {
           throw new Error("Unable to create database");

        }

        try {
            db.openDataBase();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        File database=getApplicationContext().getDatabasePath("mushrooms.db");

        if (!database.exists()) {
            // Database does not exist so copy it from assets here
            Log.i("Database", "Not Found");
        } else {
            Log.i("Database", "Found");
        }


        ListView listView = (ListView) findViewById(R.id.lvChapters);
        final String[] mushrooms = {
                "1.Белый гриб" ,
                "2.Моховик",
                "3.Лисички" ,
                "4.Опята" ,
                "5.Масленок",
                "6.Подберезовик"
        };
        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this , android.R.layout.simple_list_item_1 , mushrooms);
        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent(MainActivity.this , Information.class);
                intent.putExtra("id" , position);
                intent.putExtra("title" , adapter.getItem(position));
                startActivityForResult(intent , 0);
            }
        });


    }


    @Override
    public void onPause() {
        super.onPause();
        db.close();
    }

    @Override
    public void onResume() {
        super.onResume();
        try {
            db.openDataBase();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Information:
package vodnik.ua.cursova;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

import java.io.IOException;
import java.sql.SQLException;

/**
 * Created by Admin on 25.04.2015.
 */
public class Information extends Activity{
    DataBaseHelper db;
    int id = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.information);
       db = new DataBaseHelper(this);

        try {
            db.createDatabase();
        } catch (IOException e) {
            throw new Error("Unable to create database");
        }

        try {
            db.open();
        } catch (SQLException sqle) {
            throw new Error("Unable opening database");
        }


        String item = getIntent().getExtras().getString("title");
        id = getIntent().getExtras().getInt("id", 0);
        TextView textView = (TextView) findViewById(R.id.textView1);



        db.close();

    }
}
Ответ написан
@Eserchik
Да намешал ты конечно все в кучу.
Вот то что ты делаешь:
startandroid.ru/ru/uroki/vse-uroki-spiskom/111-uro...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 дек. 2024, в 20:40
10000 руб./за проект
22 дек. 2024, в 20:34
3000 руб./за проект
22 дек. 2024, в 20:12
10000 руб./за проект