質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.04%

Android テーブルの結合

受付中

回答 0

投稿

  • 評価
  • クリップ 1
  • VIEW 2,105
退会済みユーザー

退会済みユーザー

AndroidでContentProviderを扱っており、テーブルの結合をしたいのですが、結合されていません。
現在「test」と「category」というテーブルを作っており、

test                  category
id,text,text,text     id,text

というようなテーブルになっています。
ここでお互いのid同士をContentProvider内のonUpgradeメソッドで"select * from test inner join category on test.id = category.id"で結合させて、MainActivityのreadDBで値を取得しようとするのですが、
「while compiling: SELECT image, word, yen, category FROM test」
というエラーが出てしまいます。
どこを直せばいいか分かりません。SQLが間違っているのでしょうか?それともテーブルが作られてないのでしょうか?もしテーブルが作られてないとすれば、テーブルを確認する方法はありますか?
行き詰ってしまいまして、是非お力添えをいただきたいです。
よろしくお願いします。


public class MyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        writeTestDB("A.png", "ABC", "¥280", "category1");
        writeCateDB("カテゴリー1");
        readDB();
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.my, 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);
    }

    private void writeTestDB(String image, String word, String yen, String category){
        Uri uri=Uri.parse("content://com.example.appdev.mycontentprovider/test");
        ContentValues values=new ContentValues();
        values.put("image",image);
        values.put("word",word);
        values.put("yen",yen);
        getContentResolver().insert(uri,values);
    }

    private void writeCateDB(String cate){
        Uri uri=Uri.parse("content://com.example.appdev.mycontentprovider/category");
        ContentValues values=new ContentValues();
        values.put("category",cate);
        getContentResolver().insert(uri,values);
    }

    private void readDB(){
        Uri uri=Uri.parse("content://com.example.appdev.mycontentprovider/test");
        Cursor c=this.getContentResolver().query(uri,new String[]{"image","word","yen","category"},null,null,null);
        c.moveToFirst();
        String fileName=c.getString(0);
        String word=c.getString(1);
        String yen=c.getString(2);
        String category=c.getString(3);
        setUI(fileName,word,yen,category);
    }

    public Bitmap loadImage(String fileName, Context context) {
        final AssetManager assetManager = context.getAssets();
        InputStream is = null;
        Bitmap image=null;
        try {
            is = assetManager.open(fileName);
            image=BitmapFactory.decodeStream(is);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try{
                is.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return image;
    }

    public void setUI(String fileName,String word,String yen,String category){
        TextView categoryText=(TextView)findViewById(R.id.category);
        categoryText.setText(category);
        Bitmap image=loadImage(fileName,this);
        ImageView imageView=(ImageView)findViewById(R.id.image);
        imageView.setImageBitmap(image);
        TextView wordText=(TextView)findViewById(R.id.word);
        wordText.setText(word);
        TextView yenText=(TextView)findViewById(R.id.yen);
        yenText.setText(yen);
    }
}

--------------------------------------------------------------------------------------------

public class DBProvider extends ContentProvider {
    private final static String DB_NAME="test.db";
    private final static String DB_TABLE="test";
    private static int DB_VERSION;
    private final static String CATEGORY_DB_TABLE="category";

    private SQLiteDatabase db;

    @Override
    public boolean onCreate() {
        PackageManager packageManager=getContext().getPackageManager();
        try{
            PackageInfo packageInfo=packageManager.getPackageInfo(getContext().getPackageName(), PackageManager.GET_ACTIVITIES);
            DB_VERSION=packageInfo.versionCode;
        }catch (PackageManager.NameNotFoundException e){
            e.printStackTrace();
        }
        DBHelper dbHelper=new DBHelper(getContext());
        db=dbHelper.getWritableDatabase();
        return (db!=null);
    }

    @Override
    public Cursor query(Uri uri,String[] columns,String selection,
                        String[] selectionArgs,String sortOrder) {
        return db.query(DB_TABLE,columns,selection,
                selectionArgs,null,null,null);
    }

    @Override
    public int update(Uri uri,ContentValues values,
                      String selection,String[] selectionArgs) {
        return db.update(DB_TABLE,values,null,null);
    }

    @Override
    public Uri insert(Uri uri,ContentValues values) {
        db.insert(DB_TABLE,"",values);
        return uri;
    }

    @Override
    public int delete(Uri uri,String selection,
                      String[] selectionArgs) {
        return 0;
    }

    @Override
    public String getType(Uri uri) {
        return null;
    }

    private static class DBHelper extends SQLiteOpenHelper {

        public DBHelper(Context context) {
            super(context,DB_NAME,null,DB_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("create table if not exists "+DB_TABLE+"(id integer primary key autoincrement,image text,word text, yen text)");
        }

        @Override
        public void onUpgrade(SQLiteDatabase db,
                              int oldVersion,int newVersion) {
            db.execSQL("create table if not exists "+CATEGORY_DB_TABLE+"(id integer primary key autoincrement, category text)");
            db.execSQL("select * from test inner join category on test.id = category.id",null);
        }

        @Override
        public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("drop table if exists "+DB_TABLE);
            db.execSQL("drop table if exists "+CATEGORY_DB_TABLE);
            onCreate(db);
        }
    }
}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る