2017-01-03 13 views
1

昨日、私のデータベースを見るために素晴らしいlistViewを作ったが、今日私のデータベースに追加しようとしたところ、 "データベースが漏れた。 blablaあなたのデータベースを閉じる "。その後、私はもう私のデータベースに行を追加できませんでした。android SQLiteは、私のlistViewでデータをもう見ることができません。

しかし、私はアンドロイドスタジオを再起動し、新しい行を追加することができました(エラーはもうありません)!しかし、私が追加するニュースラインは見えません。私は自分のエラーが出る前に私が追加したラインしか見ることができません(または、私がエラーを引き起こした追加されたものを見ることができます)。私はクロムで自分のデータベースをチェックして、すべてを見たので、本当にニュースラインを追加しました!

私は何が起きているのか分かりませんが、私はいくつかのクラスについて自分の履歴をチェックしましたが、私は悪い変更をしませんでした(私は思っています)。どのように私のデータベースをもう一度見ることができますか? ContentProviderを使用してデータベースにアクセスします。

public class ViewCardEditor extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> { 
    public static final String authority = "com.example.jean.cartememoire.CardContentProvider"; 
    public String[] from; 
    public final int[] to = {R.id.idList, R.id.themeList, R.id.questionList, R.id.reponseList, R.id.difficultList}; 
    StockCard stock; 
    ViewGroup container; 
    ListView listView; 
    MySimpleCursorAdapter adapter; 
    private ArrayList<String> data = new ArrayList<String>(); 



    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup c, 
          Bundle savedInstanceState) { 
     container = c; 
     View view = inflater.inflate(R.layout.fragment_view_card_editor, container, false); 
     stock = StockCard.getInstance(container.getContext()); 
     from = new String[]{stock._ID, 
       stock.THEME, 
       stock.QUESTION, 
       stock.REPONSE, 
       stock.DIFFICULTE}; 

     // Inflate the layout for this fragment 
     if (container != null) { 
      container.removeAllViews(); 
     } 
     databaseView(view); 

     return view; 
    } 

    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     Uri.Builder builder = new Uri.Builder(); 
     Uri uri = builder.scheme("content").authority(authority) 
       .appendPath(stock.STOCK_TABLE).build(); 
     return new CursorLoader(container.getContext(), uri, from, 
       null, null, null); 
    } 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     adapter.swapCursor(data); 
    } 
    public void onLoaderReset(Loader<Cursor> loader) { 
     adapter.swapCursor(null); 
    } 



    public void databaseView(View view) 
    { 
     ArrayList<String> list; 
     Cursor cursor = stock.getData(); 

     listView = (ListView) view.findViewById(R.id.listView); 

     adapter = new MySimpleCursorAdapter(container.getContext(), R.layout.card_stock, null, from, to,0); 
     listView.setAdapter(adapter); 

     LoaderManager manager = getLoaderManager(); 
     manager.initLoader(0, null, this); 

    } 


    public void deleteOneCard(int id) 
    { 
     Uri.Builder builder = new Uri.Builder(); 
     builder.scheme("content").authority(authority).appendPath(stock.STOCK_TABLE); 

     ContentUris.appendId(builder, id); 
     Uri uri = builder.build(); 
     ContentResolver resolver = container.getContext().getContentResolver(); 
     resolver.delete(uri, null, null); 

    } 

    private class MySimpleCursorAdapter extends SimpleCursorAdapter 
    { 
     ViewHolder vh; 
     public MySimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) { 
      super(context, layout, c, from, to, flags); 

     } 

     public View newView(Context _context, Cursor _cursor, ViewGroup parent) { 
      LayoutInflater inflater = (LayoutInflater) _context.getSystemService(_context.LAYOUT_INFLATER_SERVICE); 
      View view = inflater.inflate(R.layout.card_stock, parent, false); 
      vh = new ViewHolder(); 
      vh.idList = (TextView) view.findViewById(R.id.idList); 
      vh.themeList = (TextView) view.findViewById(R.id.themeList); 
      vh.questionList = (TextView) view.findViewById(R.id.questionList); 
      vh.reponseList = (TextView) view.findViewById(R.id.reponseList); 
      vh.difficulteList = (TextView) view.findViewById(R.id.difficultList); 
      vh.Supprimer = (Button) view.findViewById(R.id.buttonDelete); 
      vh.Modifier = (Button) view.findViewById(R.id.buttonModifier); 


      view.setTag(vh); 
      return view; 
     } 

     public void bindView(View view, Context Context, Cursor cursor) { 
      vh.idList.setText(cursor.getString(cursor.getColumnIndex(stock._ID))); 
      vh.themeList.setText(cursor.getString(cursor.getColumnIndex(stock.THEME))); 
      vh.questionList.setText(cursor.getString(cursor.getColumnIndex(stock.QUESTION))); 
      vh.reponseList.setText(cursor.getString(cursor.getColumnIndex(stock.REPONSE))); 
      vh.difficulteList.setText(cursor.getString(cursor.getColumnIndex(stock.DIFFICULTE))); 

      vh.Supprimer.setOnClickListener(new View.OnClickListener() 
      { 
       public void onClick(View v) { 
        View parentView = (View)v.getParent(); 
        TextView idList = (TextView) parentView.findViewById(R.id.idList); 
        /*TextView themeList = (TextView) parentView.findViewById(R.id.themeList); 
        TextView questionList = (TextView) parentView.findViewById(R.id.questionList); 
        TextView reponseList = (TextView) parentView.findViewById(R.id.reponseList); 
        TextView difficulteList = (TextView) parentView.findViewById(R.id.difficultList);*/ 

        int id = Integer.parseInt(idList.getText().toString()); 
        deleteOneCard(id); 
        Toast.makeText(container.getContext(), "Suppression de "+id, Toast.LENGTH_SHORT).show(); 
       } 
      }); 

      vh.Modifier.setOnClickListener(new View.OnClickListener() 
      { 
       public void onClick(View v) { 
        View parentView = (View)v.getParent(); 
        TextView idList = (TextView) parentView.findViewById(R.id.idList); 
        TextView themeList = (TextView) parentView.findViewById(R.id.themeList); 
        themeList.setFocusable(true); 
        themeList.requestFocus(); 
        /*TextView questionList = (TextView) parentView.findViewById(R.id.questionList); 
        TextView reponseList = (TextView) parentView.findViewById(R.id.reponseList); 
        TextView difficulteList = (TextView) parentView.findViewById(R.id.difficultList);*/ 

        int id = Integer.parseInt(idList.getText().toString()); 
        Toast.makeText(container.getContext(), "bouton Modifier pour "+id, Toast.LENGTH_SHORT).show(); 
       } 
      }); 

     } 
    } 



    public class ViewHolder 
    { 
     Button Supprimer, Modifier; 
     TextView idList, themeList, questionList, reponseList, difficulteList; 

    } 
} 

ここでニュースライン追加するための私のクラス:

public class AddCardEditor extends Fragment { 
    EditText editTheme, editQuest, editRep; 
    RatingBar ratingBar; 
    Button buttonCreateCard; 
    CardContentProvider stock; 
    ViewGroup container; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup c, 
          Bundle savedInstanceState) { 
     View view; 
     view = inflater.inflate(R.layout.fragment_add_card_editor, container, false); 
     // Inflate the layout for this fragment 
     container = c; 
     if (container != null) { 
      container.removeAllViews(); 
     } 
     editTheme =(EditText) view.findViewById(R.id.editTheme); 
     editQuest =(EditText) view.findViewById(R.id.editQuest); 
     editRep =(EditText) view.findViewById(R.id.editRep); 
     ratingBar =(RatingBar) view.findViewById(R.id.ratingBar); 
     buttonCreateCard =(Button) view.findViewById(R.id.buttonCreateCard); 
     stock = new CardContentProvider(); 
     addData(container); 
     return view; 
    } 

    public void addData(final ViewGroup container) 
    { 

      buttonCreateCard.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        try 
        { 
         ContentValues cv = new ContentValues(); 
         CardContentProvider cp = new CardContentProvider(); 
         cv.put(stock.THEME, editTheme.getText().toString()); 
         cv.put(stock.QUESTION, editQuest.getText().toString()); 
         cv.put(stock.REPONSE, editRep.getText().toString()); 
         cv.put(stock.DIFFICULTE, ratingBar.getRating()); 

         ContentResolver resolver = container.getContext().getContentResolver(); 
         Uri.Builder builder = new Uri.Builder(); 
         System.out.println("addDATA DEBUG"); 
         builder.scheme("content").authority(stock.authority).appendPath(stock.STOCK_TABLE); 
         System.out.println("addDATA DEBUG2"); 
         Uri uri = builder.build(); 
         uri = resolver.insert(uri,cv); 
         long id = ContentUris.parseId(uri); 
         System.out.println("addDATA DEBUG3 : "+id); 
         Toast.makeText(container.getContext(), "Carte créé avec succès !", Toast.LENGTH_SHORT).show(); 
        } 
        catch (Exception e) 
        { 
         Toast.makeText(container.getContext(), "Erreur, echec de création de la carte", Toast.LENGTH_SHORT).show(); 
        } 


       } 
      }); 

    } 


} 
をここで

は私のリストビューで自分のフラグメントのクラスは(私は私のリストビューおよび一部のTextViewから私の要素の内側に2ボタンを使用)であります

その後、私のListViewのための私のレイアウト:

<?xml version="1.0" encoding="utf-8"?> 
 
<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" 
 
    android:id="@+id/relativeList" 
 
    android:descendantFocusability="blocksDescendants"> 
 

 
    <TextView 
 
     android:text="@string/difficult" 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="wrap_content" 
 
     android:id="@+id/textView8" 
 
     android:layout_below="@+id/textView7" 
 
     android:layout_alignParentLeft="true" 
 
     android:layout_alignParentStart="true" 
 
     android:layout_marginTop="29dp" /> 
 

 
    <TextView 
 
     android:text="@string/r_ponse" 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="wrap_content" 
 
     android:id="@+id/textView7" 
 
     android:layout_marginTop="20dp" 
 
     android:layout_below="@+id/textView6" 
 
     android:layout_alignParentLeft="true" 
 
     android:layout_alignParentStart="true" /> 
 

 
    <TextView 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="wrap_content" 
 
     android:id="@+id/idList" 
 
     android:layout_alignParentTop="true" 
 
     android:layout_alignLeft="@+id/themeList" 
 
     android:layout_alignStart="@+id/themeList" 
 
     tools:ignore="HardcodedText" /> 
 

 
    <TextView 
 
     android:text="Question :" 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="wrap_content" 
 
     android:id="@+id/textView6" 
 
     android:layout_marginTop="14dp" 
 
     android:layout_below="@+id/textView4" 
 
     android:layout_alignParentLeft="true" 
 
     android:layout_alignParentStart="true" 
 
     tools:ignore="HardcodedText" /> 
 

 
    <TextView 
 
     android:text="@string/id" 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="wrap_content" 
 
     android:id="@+id/textView3" 
 
     android:layout_alignParentTop="true" 
 
     android:layout_alignRight="@+id/textView4" 
 
     android:layout_alignEnd="@+id/textView4" /> 
 

 
    <TextView 
 
     android:text="Thème :" 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="wrap_content" 
 
     android:id="@+id/textView4" 
 
     android:layout_below="@+id/textView3" 
 
     android:layout_alignRight="@+id/textView6" 
 
     android:layout_alignEnd="@+id/textView6" 
 
     tools:ignore="HardcodedText" /> 
 

 
    <TextView 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="wrap_content" 
 
     android:layout_alignBottom="@+id/textView6" 
 
     android:id="@+id/questionList" 
 
     android:layout_toRightOf="@+id/themeList" 
 
     android:layout_toEndOf="@+id/themeList" /> 
 

 
    <TextView 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="wrap_content" 
 
     android:layout_above="@+id/textView8" 
 
     android:layout_alignLeft="@+id/questionList" 
 
     android:layout_alignStart="@+id/questionList" 
 
     android:id="@+id/reponseList" /> 
 

 
    <TextView 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="wrap_content" 
 
     android:layout_alignTop="@+id/textView8" 
 
     android:layout_alignRight="@+id/reponseList" 
 
     android:layout_alignEnd="@+id/reponseList" 
 
     android:id="@+id/difficultList" 
 
     android:layout_toEndOf="@+id/reponseList" 
 
     android:layout_toRightOf="@+id/reponseList" /> 
 

 
    <TextView 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="wrap_content" 
 
     android:id="@+id/themeList" 
 
     android:layout_marginLeft="33dp" 
 
     android:layout_marginStart="33dp" 
 
     tools:ignore="HardcodedText" 
 
     android:layout_below="@+id/idList" 
 
     android:layout_toRightOf="@+id/textView8" 
 
     android:layout_toEndOf="@+id/textView8" /> 
 

 
    <Button 
 
     android:text="@string/supprimerb" 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="wrap_content" 
 
     android:layout_alignParentTop="true" 
 
     android:layout_alignParentRight="true" 
 
     android:layout_alignParentEnd="true" 
 
     android:id="@+id/buttonDelete"/> 
 

 
    <Button 
 
     android:text="@string/modifierB" 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="wrap_content" 
 
     android:id="@+id/buttonModifier" 
 
     android:layout_alignTop="@+id/questionList" 
 
     android:layout_alignParentRight="true" 
 
     android:layout_alignParentEnd="true" 
 
     android:layout_alignLeft="@+id/buttonDelete" 
 
     android:layout_alignStart="@+id/buttonDelete" /> 
 
</RelativeLayout>

そして、私のContentProviderクラス:

public class CardContentProvider extends ContentProvider { 
    private StockCard stock; 

    public static String authority = "com.example.jean.cartememoire.CardContentProvider"; 
    private static String path ="Cartes_table"; 

    public static final String _ID = "_id"; 
    public static final String THEME = "THEME"; 
    public static final String QUESTION = "QUESTION"; 
    public static final String REPONSE = "REPONSE"; 
    public static final String DIFFICULTE = "DIFFICULTE"; //# = un chiffre 
    public static final String STOCK_TABLE = "Cartes_table"; 

    private static final int ID_STOCK_TABLE = 1; 
    private static final int ID_THEME = 2; 
    private static final int ID_QUESTION = 3; 
    private static final int ID_REPONSE = 4; 
    private static final int ID_DIFFICULTE = 5; 
    private static final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); 

    static { 
     matcher.addURI(authority, STOCK_TABLE, ID_STOCK_TABLE); 
     matcher.addURI(authority, STOCK_TABLE+"/*", ID_STOCK_TABLE); 

    } 


    @Override 
    public boolean onCreate() { 
     stock = StockCard.getInstance(getContext()); 
     return true; 
    } 

    @Nullable 
    @Override 
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
     SQLiteDatabase db = stock.getReadableDatabase(); 
     int code = matcher.match(uri); 
     long id; 
     Cursor cursor; 

     switch (code) 
     { 
      case ID_STOCK_TABLE: 
       cursor = db.query(STOCK_TABLE, projection, selection, 
         selectionArgs, null, null, sortOrder); 
       break; 
      default: 
       Log.d("Uri provider =", uri.toString()); 
       throw new UnsupportedOperationException("Pas encore implémenté"); 
     } 

     return cursor; 
    } 

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

    @Nullable 
    @Override 
    public Uri insert(Uri uri, ContentValues values) { 
     SQLiteDatabase db = stock.getWritableDatabase(); 
     int code = matcher.match(uri); 
     long id; 
     Uri.Builder builder = new Uri.Builder(); 

     switch(code) 
     { 
      case ID_STOCK_TABLE: 
       System.out.println(values.toString()); 
       id = db.insert(STOCK_TABLE, null, values); 
       builder.appendPath(STOCK_TABLE); 
       break; 
      default: 
       throw new UnsupportedOperationException("Pas encore implémenté"); 
     } 

     builder.authority(authority); 
     builder = ContentUris.appendId(builder, id); 

     return builder.build(); 
    } 

    @Override 
    public int delete(Uri uri, String selection, String[] selectionArgs) { 
     SQLiteDatabase db = stock.getWritableDatabase(); 
     int code = matcher.match(uri); 
     int i; 

     switch(code) 
     { 
      case ID_STOCK_TABLE: 
       long id = ContentUris.parseId(uri); 
       i = db.delete(STOCK_TABLE, "_id=" + id, null); 
       break; 
      default: 
       throw new UnsupportedOperationException("Pas encore implémenté"); 
     } 

     return 0; 
    } 

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

は助けてくれてありがとう。

EDIT: カーソルを追加してみましたが、何も変更されませんでした...しかし、データベース内の1行を削除するボタンがあります... 1行を削除すると、私のlistViewにはもう行が見えますが、私が追加した行と前に見ることができなかった行を見ることができます...私はlistViewに3行しか表示できないと思うので、listView自体の問題です。私は

EDIT 2 ... ListViewのためのドキュメントは、あまりにも私が欠場か見てチェックしています:これは間違いなく、設計上の問題であり、私はすべての項目をスクロールすることができませんでしたので、私はほんの数項目のショーを持っていました。 layout_heightが500dpのようなものに設定し、前

<FrameLayout 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="layout.ViewCardEditor" 
 
android:background="@android:color/darker_gray"> 
 

 
    <ListView 
 
     android:layout_width="match_parent" 
 
     android:layout_height="match_parent" 
 
     android:id="@+id/listView" /> 
 

 
</FrameLayout>

:ここに私のリストビューが含まれている私の新しいフラグメントレイアウトがあります。しかし今、私のlistViewは少しですが、私はスクロールすることができますが、私のlistView内のすべてのText Viewは盗聴され、そのコンテンツは他のTextViewのコンテンツを表示し、スクロール時に再び変更します。 textViewのコンテンツが他のTextViewで私と一緒にスクロールしているようです。

EDIT 3: 私はもっとエラーがなかったので私の質問を削除すると私は投票しましたが、私はリストビューに新しい問題があります、それは制限されたスクロールを持っています:私は3つのアイテムと4私はちょっとスクロールすることができます...

+0

http://stackoverflow.com/questions/12801602/android-sqlite-leakedをご覧ください。あなたにも同様の問題があるようです。 –

答えて

1

ContentResolvers.notifyChange(...)メソッドを使用して内容が変更されたことを通知する必要があります。Cursorsデータを更新するときに、カスタムContentProviderでこれを行うことができます。この呼び出しでは、変更通知用に登録されたカーソルでデータを更新できます。

関連する問題