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

앱 실행시 오류가 발생합니다. 도와주세요~~

0 추천

일단 제가 만들려고 하는 것이 첫번쨰 화면에 검색창을 뛰우고 단어를 입력해서 검색을 했을때 두번째 액티비티에서 그 검색 결과를 리스트로 보여주는 것입니다. 코드는 문제없이 통과가 되는데 실제로 구현해보면 검색 버튼을 눌렀을 때 "예상치 않게 종료되었습니다."라고 뜹니다.  여기저기 주석처리를 해서 알아봤는데 

Cursor cursor = DatabaseHelper.queryMasterTable(strSearchQuery) 부분에 문제가 있는 것 같습니다.

하루동안 고민했는데 전혀 모르겠습니다. 제발 도와주세요~~~

(처음 액티비티에서 다음 액티비티로 정보를 보내는 과정이 맞는 건지도 의심이 갑니다.)

이것은 첫번째 액티비티
public class MainActivity extends Activity {
    public static final String TAG = "DictionaryInfoView";

    EditText editSearch;
    DataListView listView;
    IconTextListAdapter adapter;
    Button btnSearch;
    String strSearch;
    InputMethodManager imm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

        editSearch = (EditText) findViewById(R.id.editText);

        btnSearch = (Button) findViewById(R.id.searchView);
        btnSearch.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                strSearch = editSearch.getText().toString();
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                intent.putExtra("strSearch",strSearch.length());
                startActivity(intent);
            }
        });
    };
}

이것은 두번째 액티비티
public class SecondActivity extends Activity {

    public static final String TAG = "SecondActivity";

    DataListView listView;
    IconTextListAdapter adapter;
    InputMethodManager imm;
    String strSearch2;
    String strSearchQuery;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview);

        Intent intent = getIntent();
        strSearch2 = intent.getStringExtra("strSearch");
        imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

        adapter = new IconTextListAdapter(this);

        listView = new DataListView(this);

        LinearLayout linLayout = (LinearLayout) findViewById(R.id.LayoutDicList);
        linLayout.addView(listView);

        strSearchQuery = strSearch2.concat("%");

        DatabaseHelper.openDatabase(DatabaseHelper.wordDatabaseFile);
        Cursor cursor = DatabaseHelper.queryMasterTable(strSearchQuery);

        AddCursorData(cursor);

        listView.setAdapter(adapter);

        listView.setOnDataSelectionListener( new OnDataSelectionListener () {

            public void onDataSelected(AdapterView parent, View v, int position, long id) {

                IconTextItem selectItem = (IconTextItem)adapter.getItem(position);

                Bundle bundle = new Bundle();
                bundle.putString("data0", selectItem.getData(0));
                bundle.putString("data1", selectItem.getData(1));

                Intent intent = new Intent( getApplicationContext(), DetailActivity.class );
                intent.putExtras(bundle);
                startActivity ( intent );
        }
        });
}

    protected void onDestroy() {
        super.onDestroy();

        DatabaseHelper.closeDatabase();
    }

     public void AddCursorData ( Cursor outCursor ) {

        int recordCount = outCursor.getCount();
        println("cursor count : " + recordCount + "\n");

        adapter.clear();

        int clasFromCol = outCursor.getColumnIndex("CLASFROM");
        int clasSoutCol = outCursor.getColumnIndex("CLASSOUT");

        Resources res = getResources();

         for (int i = 0; i < recordCount; i++) {
            outCursor.moveToNext();
            String clasFrom = outCursor.getString(clasFromCol);
            String clasSout = outCursor.getString(clasSoutCol);

            adapter.addItem(new IconTextItem(res.getDrawable(R.drawable.capsule1),clasSout,clasFrom));
        }

        outCursor.close();
    }

    public void println(String msg) {
        Log.d(TAG, msg);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

이것은 mastertable 부분

    public static Cursor queryMasterTable(String strSearchWord ) {
        String aSQL = "select WORDFROM, WORDNAME, CLASFROM, CLASSOUT "
                + " from MASTER"
                + " where CLASSOUT like ?";

        String[] args = {strSearchWord};

        Cursor outCursor = db.rawQuery(aSQL, args);

        return (outCursor);
    }

 

익명사용자 님이 2015년 2월 23일 질문

3개의 답변

0 추천
두번째 액티비티 시작할 때 onCreate 부분에서

strSearch2 = intent.getStringExtra("strSearch");

Log.d("전달받은 값",strSearch2); 로 확인해보셔도 좋을거같은데요.

저 부분에선 딱히 에러날 이유가 없을거같으니 로그로 출력이 될거같습니다.
anci (19,950 포인트) 님이 2015년 2월 23일 답변
anci님이 2015년 2월 23일 수정
출력이 되지 않네요..
로그가 출력이 안되었다고 하시는데, 첫번째 액티비티에서 두번째 액티비티로 넘기는 값이 int형이라 그런거같은데요. 로그캣 올리신거 보니 동일인물이신거같아서 여기에 댓글 다는데.. java.lang.Integer cannot be cast to java.lang.String 인걸로 봐선 , strSearch.length()을 사용하려다가 에러난게 아닌가 싶습니다.
첫번째 액티비티에서 넘겨주는 값이  strSearch.length()네요. 입력한 글자의 길이로 db 조회하시는건가요?
아 그것도 잘못됬었군요... 그런데 첫번째에서 데이터를 넘겨주는 코드는 주석처리해서 무시하고 버튼 눌렀을때 다음 액티비티로 넘어가는 코드만 살려둔 다음 두번째 액티비티에 strSearch2를 따로 지정해서 실행해도 오류가 발생하네요...
0 추천

queryMasterTable 에서

Cursor outCursor = db.rawQuery(aSQL, args);

db를 정의해주는 부분이 안보이네요....

nicehee (73,100 포인트) 님이 2015년 2월 23일 답변
정의는 되어있습니다
public static SQLiteDatabase db;
정의하고 값을 가져오는 부분도 올려보시공
public static void openDatabase(String databaseFile){
 
        println("creating or opening database [" + wordDatabaseFile + "].");
 
        try{
            db = SQLiteDatabase.openDatabase(
                    databaseFile,null,SQLiteDatabase.OPEN_READWRITE);
 
        } catch (SQLiteException ex) {
    }
}
0 추천
그럼 어떻게 해야하죠?
익명사용자 님이 2015년 2월 23일 답변
...