2013-07-03 4 views
3

그래서 Android 앱에서 사용할 데이터베이스를 만들었습니다. 내가 뭘하려고 오전, 간단한 내 데이터베이스에서 읽고 텍스트 뷰에 데이터를 표시하고, 여기에 DataBaseHelper 클래스Android : 런타임시 SQLite 데이터베이스에서 읽기

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'(실제로는 로캘에서 표시하지 않으려 고합니다)를 표시하고 app 버튼 중 하나를 누르면 응용 프로그램이 충돌합니다. 여기

내가 로그 캣에서 얻을 오류입니다

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는 데이터베이스 브라우저를 사용하여 데이터베이스를 만든 하지만 로케일 (텍스트) 필드에 값이 'en_US'인 android_metadata라는 테이블이 있고 다른 테이블은 기본 필드가 '_id'이고 다른 필드가 '농담'인 'tix'입니다. 그게 전부입니다.

누구든지 잘못된 점을 지적 할 수 있습니까? 어떻게 수정합니까? 이것이 데이터베이스에서의 첫 번째 시도이기 때문에 확실히 도움이 필요합니다./

+0

'SQLiteAssetHelper'를 사용하여 미리 패키지화 된 데이터베이스 설정을 처리하십시오 : https://github.com/jgilfelt/android-sqlite-asset-helper – CommonsWare

+0

나는 많이 알지 못한다. 그러나 내가 읽은 것으로부터 꽤 똑같은 일을한다. 그리고 시도하는 것에 관해서, 나는 지금했다, 돕지 않았다, 정확한 같은 과실 메시지를 알아 듣는다. 그래도 고마워. – iMan

+0

도와주세요. http://stackoverflow.com/questions/20728808/android-reading-stored-sqlite-database – gandharv09

답변

3

커서를 TextView에 놓기 만하면 작동하지 않습니다. 콘텐츠를 먼저 가져와야합니다.

당신이 당신의 DB 클래스에 다음과 같이 그것을 시도 coukd :

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; 
} 

와 텍스트 뷰에 : 그

아니 가장 좋은 방법은 같은

tv.setText(dbh.data()); 

또는 뭔가를하지만

를 작동합니다
+0

감사하지만 유감스럽게도 작동하지 않습니다. 어쩌면 열 또는 행 인덱스와 관련이 있다고 생각합니까? 내 데이터베이스에 2 테이블, android_metadata 및 tix, 어떻게 데이터베이스에서 tix 테이블을 선택합니까? 나는 많은 것을 봤어, 이걸로 나를 도울 설명을 찾지 못했습니다. 분명히 아무 생각이 없습니다. – iMan

+0

쿼리에서 데이터베이스를 선택합니다. DB_NAME이 (가) 귀하의 표입니다. –

+0

감사합니다. 이제 db를 부분적으로 액세스 할 수 있습니다.내 데이터베이스가 있다고 말해. '| -------------------------- | ' '| _id | 농담 | | -------------------------- | | 1 | 농담 | | 2 | 농담 | | -------------------------- |' 이제 getString (0)이 0 일 때 의 결과가 "1"로 출력됩니다. 와 jokeA'getString (1)'이라면, 어떻게 jokeB를 얻을 수 있습니까? 다른 정수 값이 있으면 응용 프로그램이 충돌합니다! – iMan

관련 문제