마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

no such table 때문에 미치겠습니다 아주....(풀소스 주의)

0 추천

진득하니 봐주시면 정말 감사드리겠습니다 ㅠ

 

package com.again.studyenglish1;
 
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
 
public class FlashingWords2 extends Activity {
     
    private static String DB_PATH = "/sdcard/";
    private static String DB_NAME = "dictionary.sqlite";
    private int listcount = 0;
    private int currentPos = 0;
    private boolean isPlaying = false;
    private String[] wordList = null;
    private String[] definitionList = null;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.flashingwords2);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        loadData();
         
        Button startButton = (Button)findViewById(R.id.startbtn2);
        startButton.setOnClickListener(new View.OnClickListener() {
             
            @Override
            public void onClick(View arg0) {
                isPlaying = true;
                 
            }
        });
         
        Button stopButton = (Button)findViewById(R.id.stopbtn2);
        stopButton.setOnClickListener(new View.OnClickListener() {
             
            @Override
            public void onClick(View arg0) {
                isPlaying = false;
            }
        });
         
        setWord();
         
    }
 
    public void setWordData()
    {
        if (isPlaying == true)
        {
            TextView wordText = (TextView)findViewById(R.id.word2);
            TextView definitionText = (TextView)findViewById(R.id.definition2);
             
            wordText.setText(wordList[currentPos]);
            definitionText.setText(definitionList[currentPos]);
            currentPos++;
             
            if (currentPos >= listcount)
            {
                currentPos = 0;
            }
        }
    }
     
    public void setWord()
    {
        setWordData();
         
        Handler mHandler = new Handler();
        mHandler.postDelayed(new Runnable()
        {
            @Override
            public void run()
            {
                setWord();
            }
        }, 1000);
    }
     
    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
    {
        InputStream myInput = this.getAssets().open(DB_NAME);
        String outFileName = DB_PATH + DB_NAME;
        OutputStream myOutput = new FileOutputStream(outFileName);
         
        byte[] buffer = new byte[1024];
        int total_length = 0;
        int length;
         
        while ((length = myInput.read(buffer))>0);
        {
            myOutput.write(buffer, 0, length);
            total_length += length;
        }
         
        total_length += length;
        myOutput.flush();
        myOutput.close();
        myInput.close();
         
    }
     
    public void createDatabase() throws IOException
    {
        boolean dbExist = checkDatabase();
         
        if (dbExist){}
        else
        {
            try
            {
                copyDatabase();
            }
            catch (IOException e)
            {
                throw new Error("DB를 복사하지 못했습니다!");
            }
        }
    }
     
    public void loadData()
    {
    try
    {
        createDatabase();
    }
     
    catch (IOException e)
    {
        Toast.makeText(this, "DB 파일을 생성할 수 없습니다.", Toast.LENGTH_LONG).show();
    }
     
    listcount = 0;
     
    try
    {
        Cursor cursor;
         
        SQLiteDatabase db =
        SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null, 1);
         
        String[] FROM = {"*"};
        cursor = db.query("vocabulary2", FROM, null, null, null, null, null);
        startManagingCursor(cursor);
         
        while (cursor.moveToNext())
        {
            wordList[listcount] = cursor.getString(0);
            definitionList[listcount] = cursor.getString(1);
            listcount++;
        }
         
        if (db != null)
        db.close();
        }
         
        catch (Exception e)
        {
            Toast.makeText(this, "에러 : " + e.toString(), Toast.LENGTH_LONG).show();
        }
     
    }
         
}
    

 

이건 단어 암기 기능을 구현한 건데요.

DB에 저장되어있는 단어와 그 뜻을 TextView에다가 뿌려주고. 1초마다 다음 단어로 넘어가게 하고, 시작과 중지를 할 수 있게 구현하려고 한 겁니다.

 

사실 이 액티비티에만 이 기능이 구현된게 아니라 이 전의 액티비티 한 개에도 이 기능이 구현되어 있는데요.

그건 no such table 따위 뜨지 않고 잘만 돌아갑니다.

두번째 것인 이것만 계속 오류메세지를 뱉어내고 있네요 ㅠㅠ

앞으로 몇 개를 똑같이 더 해야 하는데 이거 큰일났습니다 흑...

 

로그캣에 찍힌 문장은 정확히 이렇습니다:

(1) no such table: vocabulary2 (//1인지 l인지 확실치는 않지만...)

 

아무리 db를 다시 들여봐도 맞춤법도 틀린 것 하나 없고, 제대로 assets 파일에 들어가 있고, 무엇보다 이전에 구현해놓은 액티비티에서는 잘만 돌아간다는 사실이 저를 환장하게 만드는군요.

혹시 이런 류의 코딩을 할때 데이터베이스에 복수 테이블을 둬서 가져오는 게 불가능한 건가요?

그렇다고 한다면 저걸 어떻게 때려잡아야 하나요?

제발 초보 좀 살려주세요 ㅠㅠㅠ

 

(아, 혹시 심심하신 분 계시면 CursorLoader 클래스 쓰는 법 좀 가르쳐주세요... startManagingCursor는 deprecated 됐더군요... 옛날 책 보니 이런 단점이...)

해츨링 (290 포인트) 님이 2013년 6월 18일 질문

1개의 답변

0 추천
cursor = db.query("vocabulary2", FROM, null, null, null, null, null); 
 
이 구문 때문인 것 같은데 해당 테이블이 DB에 있나요?
 
SQLiteDatabase db = SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null, 1);
        
        String[] FROM = {"*"};
        cursor = db.query("vocabulary2", FROM, null, null, null, null, null);        
 
위의 구문에서 DB_PATH와 DB_NAME이 정상적으로 들어가있는지 로그 띄우고 위의 테이블이 해당 db에 있는지 확인하면 될 것 같습니다.
滅成地天何 (400 포인트) 님이 2013년 6월 19일 답변
네, 확실히 vocabulary2 테이블이 db파일 안에 들어있습니다.
DB_PATH 와 DB_NAME 같은 경우도 잘 작동하는 이전 액티비티와 똑같이 설정해놓았구요.

로그를 봐도 저 문장만 나오고 아무 말이 없네요.
Exception e를 잡아서 토스트로 뜨게 해 놓은 오류표시는 이렇습니다.
android:database.sqlite.SQLiteException:no such table:vocabulary2(code 1):, while compiling : SELET * FROM vocabulary2
라고 뜨네요.

믿을 건 여기밖에 없습니다 ㅠㅠ
...