SQLITE3 передает дубликаты и неверные данные в фрагмент Android с помощью Android Studio - PullRequest
0 голосов
/ 03 декабря 2018

A word проект SQLITE3, используемый во фрагменте Android, передает данные последнего кортежа несколько раз.Тем не менее, я переписал код в другом проекте с именем people без использования фрагмента работает хорошо.Интересно, почему эта проблема возникает, поскольку код части передачи данных практически одинаков.НИЖЕ - часть передачи данных двух проектов.

1.проблема в проекте: слово

1.1фрагмент

public class fragment_review extends Fragment {
private OnFragmentInteractionListener mListener;

private ArrayList<word> wordlist;
private SQLiteDatabase db;
private DBHelper dbHelper;
private View rootView;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){
    rootView = inflater.inflate(fragment_fragment_review, container,false);
    manageDatabase();
    return rootView;
}

private void manageDatabase() {
    LinearLayout put_text = (LinearLayout) rootView.findViewById(R.id.store_sample_database);

    wordlist = new ArrayList<word>();

    dbHelper = new DBHelper(getActivity());
    db = dbHelper.getWritableDatabase();

    Cursor cursor=db.rawQuery("select * from wordtable",null);
    while (cursor.moveToNext()) {
        String id = cursor.getString(cursor.getColumnIndex("id"));
        String en_word = cursor.getString(cursor.getColumnIndex("en_word"));
        String meaning = cursor.getString(cursor.getColumnIndex("meaning"));
        word w=new word(id, en_word, meaning);
        wordlist.add(w);
    }
    for (word w:wordlist) {

        TextView tv = new TextView(getActivity());

        tv.setText(w.toString());
        tv.setTextSize(18);

        put_text.addView(tv);
    }
}

public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction(Uri uri);
}

}

1.2DBHelper.java

public class DBHelper extends SQLiteOpenHelper {
String CREATE_TABLE="CREATE TABLE wordtable(id INTEGER PRIMARY KEY AUTOINCREMENT," +
        "en_word CHAR," +
        "meaning CHAR)";
String INSERT_DATA="INSERT INTO wordtable (id,en_word,meaning)";
String VALUES1 ="VALUES(1, '00N1','S1' )";
String VALUES2 ="VALUES(2, 'hvN2','S2' )";
String VALUES3 ="VALUES(3, 'N3','b kjbS3' )";
String VALUES4 ="VALUES(4, 'N4','xddfS4' )";
//build databse
public DBHelper(Context context) {
    super(context, "word_2ed.db",null,1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    //build table
    db.execSQL("DROP TABLE IF EXISTS wordtable");
    db.execSQL(CREATE_TABLE);
    db.execSQL(INSERT_DATA+VALUES1);
    db.execSQL(INSERT_DATA+VALUES2);
    db.execSQL(INSERT_DATA+VALUES3);
    db.execSQL(INSERT_DATA+VALUES4);

}

1.3 РЕЗУЛЬТАТ ПРОЕКТА word

WRONG OUTPUT

2 отлично работает в проекте: люди

2.1 MainActivity.java

public class MainActivity extends AppCompatActivity {
List<person> personList;
private MyOpenHelper myOpenHelper;
private SQLiteDatabase db;

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


private void initUI() {//SAME AS THE manageDatabase() METHOD
    LinearLayout ll=(LinearLayout) findViewById(R.id.LL);
    LinearLayout entry1 = findViewById(R.id.ll_first);
    LinearLayout entry2 = findViewById(R.id.ll_second);

    personList = new ArrayList<person>();

    myOpenHelper = new MyOpenHelper(this);
    db = myOpenHelper.getWritableDatabase();

    Cursor cursor=db.rawQuery("select * from person",null);
    while (cursor.moveToNext()) {
        String _id = cursor.getString(cursor.getColumnIndex("_id"));
        String name = cursor.getString(cursor.getColumnIndex("name"));
        String salary = cursor.getString(cursor.getColumnIndex("salary"));
        String phone = cursor.getString(cursor.getColumnIndex("phone"));
        person p=new person(_id, name, salary, phone);
        personList.add(p);
    }
    for(person p:personList)
    {

        TextView tv1=new TextView(this);
        TextView tv2=new TextView(this);



        tv1.setText(p.toString1());
        tv1.setTextSize(18);
        tv2.setText(p.toString2());
        tv2.setTextSize(18);

        entry1.addView(tv1);
        entry2.addView(tv2);
    }

    }
    }

2.2MyOpenHelper.Ява

public class MyOpenHelper extends SQLiteOpenHelper {
String CREATE_TABLE="CREATE TABLE person(_id INTEGER PRIMARY KEY AUTOINCREMENT," +
        "name CHAR," +
        "salary CHAR," +
        "phone CHAR)";
String INSERT_DATA="INSERT INTO person (_id,name,salary,phone)";
String VALUES1 ="VALUES(1, 'N1','S1','P1' )";
String VALUES2 ="VALUES(2, 'N2','S2','P2' )";
String VALUES3 ="VALUES(3, 'N3','S3','P3' )";
String VALUES4 ="VALUES(4, 'N4','S4','P4' )";
public MyOpenHelper(Context context) {
    super(context, "people.db",null,1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_TABLE);
    db.execSQL(INSERT_DATA+VALUES1);
    db.execSQL(INSERT_DATA+VALUES2);
    db.execSQL(INSERT_DATA+VALUES3);
    db.execSQL(INSERT_DATA+VALUES4);

}

1 Ответ

0 голосов
/ 03 декабря 2018

Я отладил и обнаружил, что атрибуты в word были определены как public, а атрибуты в people определены как частные.Решение - изменить общедоступное на частное(Я не показывал этот код здесь).Или же публичные атрибуты изменятся после создания нового объекта.Хотя мне не очень понятно, почему публика стала причиной такого изменения Arraylist.

...