Nano Hash - криптовалюты, майнинг, программирование

Android: чтение из базы данных SQLite во время выполнения

Итак, я создал базу данных для использования в своем приложении для Android. То, что я пытаюсь сделать, простое, просто прочитайте из моей базы данных и отобразите данные в TextView, вот класс DataBaseHelper

    package com.tix.activity;

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

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

public class DatabaseHelper extends SQLiteOpenHelper{
    private static String DB_PATH = "/data/data/com.tix.activity/databases/";
    private static String DB_NAME = "tix";
    private SQLiteDatabase myDatabase;
    private final Context myContext;

    public DatabaseHelper (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 Error("Error copying Database");
        }
    }
}

private boolean checkDataBase() {
    // TODO Auto-generated method stub
    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{
    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) {

}

public Cursor data(){
    Cursor c;
    c = myDatabase.query(DB_NAME,null,null,null,null,null,null);
    return c;
}
}

И это мой класс MainActivity

package com.tix.activity;

import java.io.IOException;

import android.os.Bundle;
import android.app.Activity;
import android.database.Cursor;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
Cursor cur;
TextView tv;
Button next, prev;
DatabaseHelper dbh;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView)findViewById(R.id.tv);
        next = (Button)findViewById(R.id.nbtn);
        prev = (Button)findViewById(R.id.pbtn);

        dbh = new DatabaseHelper(this);

        try {
            dbh.createDataBase();
        } catch (IOException e2) {
            e2.printStackTrace();
        }

        dbh.openDataBase();
        cur = dbh.data();
        cur.moveToFirst();
        tv.setText(cur.getString(1));

        next.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if(cur.isLast())
                {
                    cur.moveToFirst();
                    tv.setText(""+cur.getString(1));
                }
                else
                {
                    cur.moveToNext();
                    tv.setText(""+cur.getString(1));

                }
            }
        });
        prev.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
            if(cur.isFirst()){
                cur.moveToLast();
                tv.setText(""+cur.getString(1));
            }
            else
            {
                cur.moveToPrevious();
                tv.setText(""+cur.getString(1));
            }
            }
        });

    }
}

Но каждый раз, когда я запускаю приложение в эмуляторе, оно просто вылетает. Но если я вставлю tv.setText(cur.getString(0)); вместо tv.setText(cur.getString(1));

затем я получаю текстовое представление для отображения «en_US» (которое я действительно не хочу отображать, вероятно, из локали), и при нажатии любой из кнопок приложение вылетает.

Вот ошибка, которую я получаю на LogCat,

07-03 16:37:45.120: E/CursorWindow(1912): Failed to read row 0, column 1 from a CursorWindow which has 1 rows, 1 columns.
07-03 16:37:45.160: D/AndroidRuntime(1912): Shutting down VM
07-03 16:37:45.160: W/dalvikvm(1912): threadid=1: thread exiting with uncaught exception (group=0x40a70930)
07-03 16:37:45.180: E/AndroidRuntime(1912): FATAL EXCEPTION: main
07-03 16:37:45.180: E/AndroidRuntime(1912): java.lang.IllegalStateException: Couldn't read row 0, col 1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
07-03 16:37:45.180: E/AndroidRuntime(1912):     at android.database.CursorWindow.nativeGetString(Native Method)
07-03 16:37:45.180: E/AndroidRuntime(1912):     at android.database.CursorWindow.getString(CursorWindow.java:434)
07-03 16:37:45.180: E/AndroidRuntime(1912):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
07-03 16:37:45.180: E/AndroidRuntime(1912):     at com.tix.activity.MainActivity$2.onClick(MainActivity.java:65)
07-03 16:37:45.180: E/AndroidRuntime(1912):     at android.view.View.performClick(View.java:4202)
07-03 16:37:45.180: E/AndroidRuntime(1912):     at android.view.View$PerformClick.run(View.java:17340)
07-03 16:37:45.180: E/AndroidRuntime(1912):     at android.os.Handler.handleCallback(Handler.java:725)
07-03 16:37:45.180: E/AndroidRuntime(1912):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-03 16:37:45.180: E/AndroidRuntime(1912):     at android.os.Looper.loop(Looper.java:137)
07-03 16:37:45.180: E/AndroidRuntime(1912):     at android.app.ActivityThread.main(ActivityThread.java:5039)
07-03 16:37:45.180: E/AndroidRuntime(1912):     at java.lang.reflect.Method.invokeNative(Native Method)
07-03 16:37:45.180: E/AndroidRuntime(1912):     at java.lang.reflect.Method.invoke(Method.java:511)
07-03 16:37:45.180: E/AndroidRuntime(1912):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-03 16:37:45.180: E/AndroidRuntime(1912):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-03 16:37:45.180: E/AndroidRuntime(1912):     at dalvik.system.NativeStart.main(Native Method)
07-03 16:39:01.480: I/Process(1912): Sending signal. PID: 1912 SIG: 9
07-03 16:39:30.201: W/Trace(1966): Unexpected value from nativeGetEnabledTags: 0
07-03 16:39:30.201: W/Trace(1966): Unexpected value from nativeGetEnabledTags: 0
07-03 16:39:30.631: W/Trace(1966): Unexpected value from nativeGetEnabledTags: 0
07-03 16:39:30.631: W/Trace(1966): Unexpected value from nativeGetEnabledTags: 0
07-03 16:39:31.522: E/CursorWindow(1966): Failed to read row 0, column 1 from a CursorWindow which has 1 rows, 1 columns.
07-03 16:39:31.531: D/AndroidRuntime(1966): Shutting down VM
07-03 16:39:31.531: W/dalvikvm(1966): threadid=1: thread exiting with uncaught exception (group=0x40a70930)
07-03 16:39:31.582: E/AndroidRuntime(1966): FATAL EXCEPTION: main
07-03 16:39:31.582: E/AndroidRuntime(1966): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tix.activity/com.tix.activity.MainActivity}: java.lang.IllegalStateException: Couldn't read row 0, col 1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
07-03 16:39:31.582: E/AndroidRuntime(1966):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
07-03 16:39:31.582: E/AndroidRuntime(1966):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-03 16:39:31.582: E/AndroidRuntime(1966):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-03 16:39:31.582: E/AndroidRuntime(1966):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-03 16:39:31.582: E/AndroidRuntime(1966):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-03 16:39:31.582: E/AndroidRuntime(1966):     at android.os.Looper.loop(Looper.java:137)
07-03 16:39:31.582: E/AndroidRuntime(1966):     at android.app.ActivityThread.main(ActivityThread.java:5039)
07-03 16:39:31.582: E/AndroidRuntime(1966):     at java.lang.reflect.Method.invokeNative(Native Method)
07-03 16:39:31.582: E/AndroidRuntime(1966):     at java.lang.reflect.Method.invoke(Method.java:511)
07-03 16:39:31.582: E/AndroidRuntime(1966):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-03 16:39:31.582: E/AndroidRuntime(1966):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-03 16:39:31.582: E/AndroidRuntime(1966):     at dalvik.system.NativeStart.main(Native Method)
07-03 16:39:31.582: E/AndroidRuntime(1966): Caused by: java.lang.IllegalStateException: Couldn't read row 0, col 1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
07-03 16:39:31.582: E/AndroidRuntime(1966):     at android.database.CursorWindow.nativeGetString(Native Method)
07-03 16:39:31.582: E/AndroidRuntime(1966):     at android.database.CursorWindow.getString(CursorWindow.java:434)
07-03 16:39:31.582: E/AndroidRuntime(1966):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
07-03 16:39:31.582: E/AndroidRuntime(1966):     at com.tix.activity.MainActivity.onCreate(MainActivity.java:38)
07-03 16:39:31.582: E/AndroidRuntime(1966):     at android.app.Activity.performCreate(Activity.java:5104)
07-03 16:39:31.582: E/AndroidRuntime(1966):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
07-03 16:39:31.582: E/AndroidRuntime(1966):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
07-03 16:39:31.582: E/AndroidRuntime(1966):     ... 11 more

Мой xml выглядит следующим образом, в любом случае это не имеет значения,

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/pbtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="33dp"
        android:layout_marginTop="48dp"
        android:text="Back" />

    <Button
        android:id="@+id/nbtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/pbtn"
        android:layout_alignBottom="@+id/pbtn"
        android:layout_alignParentRight="true"
        android:layout_marginRight="25dp"
        android:text="Next" />

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/pbtn"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="141dp"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

Я создал базу данных с помощью обозревателя баз данных SQLite, но она содержит таблицу с именем android_metadata с полем локали (текст) со значением «en_US», а другая таблица — «tix» с основным полем как «_id», а другое поле — как «шутки». '. Это все.

Может ли кто-нибудь указать, что не так? И как мне это исправить? Мне определенно нужна помощь с этим, потому что это мой первый опыт работы с базой данных :/


  • Рассмотрите возможность использования SQLiteAssetHelper для настройки предварительно упакованной базы данных: github.com/jgilfelt/ android-sqlite-asset-helper 03.07.2013
  • Я мало что знаю, но из того, что я читал, это почти то же самое. А что касается попытки, я только что сделал, не помогло, получил точно такие же сообщения об ошибках. Спасибо хоть. 03.07.2013
  • Пожалуйста, помогите с этим stackoverflow.com/questions/20728808/< /а> 22.12.2013

Ответы:


1

Просто поместить курсор в TextView не получится. Сначала вам нужно получить содержимое.

вы можете попробовать это в своем классе БД:

public String data(){
    Cursor c;
    String result;


     c = myDatabase.query(DB_NAME,null,null,null,null,null,null);

        try {
                if (c.moveToFirst()) {
                    result = cursor.getString(0);
                }
                result = c.getString(0);
            } finally {
                c.close();
            }

    return result;
}

и в вашем TextView:

tv.setText(dbh.data());

Или что-то подобное

Не лучший способ, но должен работать

03.07.2013
  • Спасибо, но, к сожалению, это не работает. Я считаю, что это может быть связано с индексом столбца или строки? У меня есть 2 таблицы в моей базе данных, android_metadata и tix, но как мне выбрать таблицу tix из базы данных? Я много гуглил, не нашел объяснения, которое помогло бы мне в этом. Я явно понятия не имею. 04.07.2013
  • Вы выбираете базу данных в запросе. DB_NAME — это ваша таблица. 04.07.2013
  • Спасибо, теперь я могу частично получить доступ к своей БД. Скажем, мой db, |--------------------------| | _id | jokes | |--------------------------| | 1 | jokeA | | 2 | jokeB | |--------------------------| теперь я получаю, вывод как 1, когда getString(0) и шутка A, если getString(1), как мне получить шуткуB? Любое другое целочисленное значение приводит к сбою приложения! 04.07.2013
  • Я только что понял, что вы должны указать другие утверждения. Я добавлю еще один ответ позже сегодня. Я сейчас занят :) Держитесь :) Тем временем вы можете прочитать документацию по запросу :) 04.07.2013
  • Хорошо, просто измените запрос на то, что вам нужно goo.gl/0jg3k Задайте переменные, из которых ваша активность в запросе, чтобы вы могли запрашивать практически любые данные в своей базе данных 04.07.2013
  • Спасибо, что связались со мной, я дам вам знать через некоторое время, если это сработает, надеюсь, что это сработает. :) 04.07.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..