Android在列表视图中设置sqlite数据库值 [英] Android Setting sqlite database values in an listview

查看:82
本文介绍了Android在列表视图中设置sqlite数据库值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在设置android中的ListView时遇到问题.一切正常,但没有设置我想要的设置方式.这是图片

I am Facing a problem in setting a ListView in android . Everything works ok but it is not setting the way i want it to set . here are the images whats happening

当我添加数据时,它可以很好地显示并准确地插入数据,但是当我返回然后再次启动活动时,它将检索数据并将其显示在listview的单行中.

when i add the data it displays fine and inserts the data accurately but when i go back and then again starts the activity , it retrieves the data and displays it in single row of listview .

1)我想在listview的不同项目上显示每个条目的数据.我不知道该怎么做到.

1)i want to display the data each entry on different items of listview . i don't know how can i achieve it .

2)当我开始活动时,它应该显示所有数据库条目,而当我添加新项目时,它应该附加上一个列表.但是实际发生的情况是,当已经有3条记录显示并且我再添加一条记录时,它会显示最后添加的一条记录.以前添加的记录不见了.我不知道为什么他们没有显示.

2)when i start the activity it should display all database entries and when i add the new item it should append with the previous list . but what actually happening is when there are already 3 records showing and i add one more record it displays the single record last added . previously added records are gone . i don't know why they are not displaying .

这是我的代码:

public class noticall extends ListActivity {


    CustomDateTimePicker custom;
    TextView tv,tv1;
    EditText ed;
    String store;
    static String Names;
    public static final int PICK_CONTACT = 1;
    String [] adi ;
    String [] adi1 ;
    String [] adi2 ;
    String [] adi3 ;
    static int incre=0;
    ArrayList<String> myrows = new ArrayList<String>();
    ArrayList<String> time1 = new ArrayList<String>();
    ArrayList<String> name1 = new ArrayList<String>(); 
    ArrayList<String> number1 = new ArrayList<String>();
    private PendingIntent pendingIntent;
    ListView listview;
    String temp1 ,temp2 ;
    int x=0; 
    OnItemClickListener listener;
    String Date,Time,Name,Number;
    MyNotiAdapter adp;


    private SQLiteAdapter mySQLiteAdapter = new SQLiteAdapter(noticall.this);



        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.notify);
            listview = (ListView) findViewById(android.R.id.list);

           listview.setDividerHeight(2);



    custom = new CustomDateTimePicker(noticall.this,new CustomDateTimePicker.ICustomDateTimeListener() {

               @Override
               public void onCancel() { 
                   finish();
               }


               @Override
               public void onSet(Dialog dialog, Calendar calendarSelected,Date dateSelected, int year, String monthFullName,
                            String monthShortName, int monthNumber, int date,
                            String weekDayFullName, String weekDayShortName,
                            int hour24, int hour12, int min, int sec,
                            String AM_PM) {

                      Calendar calendar =  Calendar.getInstance();
                      calendar.set(year, monthNumber, date, hour24,  min, 0);

                      long when = calendar.getTimeInMillis();         // notification time

                      Intent myIntent = new Intent(noticall.this, MyReceiver.class);
                      pendingIntent = PendingIntent.getBroadcast(noticall.this, 0, myIntent,0);

                      AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
                      alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);


        Date = calendarSelected.get(Calendar.DAY_OF_MONTH) + "/" + (monthNumber+1) + "/" +year; 
        Time = hour12 + ":" + min + " " + AM_PM;


        setlisto(Date);


        //Toast.makeText(noticall.this, store, Toast.LENGTH_SHORT).show();

           }
    });      



            custom.set24HourFormat(false);
            custom.setDate(Calendar.getInstance());



                findViewById(R.id.button_date).setOnClickListener(
                    new OnClickListener() {
                        @Override
                        public void onClick(View v) {



                        Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
                        startActivityForResult(intent,PICK_CONTACT);
                        custom.showDialog();
                        incre++;
                        }
                    });



                read_db();

    }




     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data)
     {
       super.onActivityResult(requestCode, resultCode, data);

        if(resultCode != RESULT_CANCELED){

            if (requestCode == 1)
            {
                // Get the URI that points to the selected contact
                Uri contactUri = data.getData();

                // We only need the NUMBER column, because there will be only one row in the result
                String[] projection = {ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.CONTACT_ID};

                String[] segments = contactUri.toString().split("/");
                String id = segments[segments.length - 1];

                // Perform the query on the contact to get the NUMBER column
                // We don't need a selection or sort order (there's only one result for the given URI)
                // CAUTION: The query() method should be called from a separate thread to avoid blocking
                // your app's UI thread. (For simplicity of the sample, this code doesn't do that.)
                // Consider using CursorLoader to perform the query.
                Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null, null);
                cursor.moveToFirst();
                while (!cursor.isAfterLast())
                {
                    int cid = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID);
                    String contactid = cursor.getString(cid);

                    if (contactid.equals(id))
                    {
                        // Retrieve the phone number from the NUMBER column
                        int column = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
                        String number = cursor.getString(column);

                        // Retrieve the contact name from the DISPLAY_NAME column
                        int column_name = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
                        String name = cursor.getString(column_name);

                        // Do something with the phone number...
                       // Toast.makeText(this, "I added the Contact: \n" + name + " " + number, Toast.LENGTH_SHORT).show();

                       // ed.setText(name+" - "+number);

                      Name=  Names=name;
                      Number =number;  



                    }

                 cursor.moveToNext();
                }
                cursor.close();


               }
            }
        }


     public void setlisto(String one ){



    // Log.e("setlistoo",one+"");
     myrows.add(one);
     time1.add(Time);
     name1.add(Name);
     number1.add(Number);

      adi=myrows.toArray(new String[myrows.size()]);
     adi1=time1.toArray(new String[time1.size()]);
     adi2=name1.toArray(new String[name1.size()]);
     adi3=number1.toArray(new String[number1.size()]);
     x++;
     listview.setAdapter(new MyNotiAdapter(noticall.this, adi,adi1,adi2,adi3));



     Log.i("a=",one+"");

     Log.i("b=",Time+"");

     Log.i("c=",Name+"");

     Log.i("d=",Number+"");



     mySQLiteAdapter = new SQLiteAdapter(noticall.this);
     mySQLiteAdapter.openToWrite();

     mySQLiteAdapter.insert(one,Time,Name,Number);


     mySQLiteAdapter.close();


  }
     public void del_db(){

         mySQLiteAdapter = new SQLiteAdapter(noticall.this);
         mySQLiteAdapter.openToWrite();

         mySQLiteAdapter.deleteAll();

     }



     public void read_db(){

         Log.e("jsahbdv", "munda agaya medaan men hay jamaalo");


            mySQLiteAdapter.openToRead();

            Cursor cursor = mySQLiteAdapter.getAllData();

            startManagingCursor(cursor);

            String[] from = new String[]{SQLiteAdapter.KEY_Name,SQLiteAdapter.KEY_Number,SQLiteAdapter.KEY_Date,SQLiteAdapter.KEY_Time};
            int[] to = new int[]{R.id.dato,R.id.tym,R.id.person,R.id.edu};

           SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(noticall.this, R.layout.row2, cursor, from, to);



           while (cursor.moveToNext()){



               cursor.getString(0);
               cursor.getString(1);
               cursor.getString(2);
               cursor.getString(3);
               cursor.getString(4);



            /*   strBfr.append("Id :"+ cursor.getString(0) + "\n");
               strBfr.append("Name:" + cursor.getString(1) + "\n");
               strBfr.append("Number:" +cursor.getString(2) + "\n");
               strBfr.append("Date:" + cursor.getString(3) + "\n");
               strBfr.append("Time:" + cursor.getString(4) + "\n");

             */  

               Log.i("Error", cursor.getString(0)+"");
               Log.i("Error", cursor.getString(1)+"");
               Log.i("Error", cursor.getString(2)+"");
               Log.i("Error", cursor.getString(3)+"");
               Log.i("Error 8", cursor.getString(4)+"");


               listview.setAdapter(cursorAdapter);

     }

     }


}

sqlite适配器类:

public class SQLiteAdapter {

    public static final String MYDATABASE_NAME = "notidb.db";
    public static final String MYDATABASE_TABLE = "MY_TABLE";
    public static final int MYDATABASE_VERSION = 1;
    public static final String KEY_ID = "_id";
    public static final String KEY_Name = "Name";
    public static final String KEY_Number = "Number";
    public static final String KEY_Date = "Date";
    public static final String KEY_Time = "Time";



    //create table MY_DATABASE (ID integer primary key, Content text not null);
    private static final String SCRIPT_CREATE_DATABASE =
        "create table " + MYDATABASE_TABLE + " ("
        + KEY_ID + " integer primary key autoincrement, "
        + KEY_Name + " text not null, " 
        + KEY_Number + " text not null, " 
        + KEY_Date + " text not null, " 
        + KEY_Time + " text not null);";


    private SQLiteHelper sqLiteHelper;
    private SQLiteDatabase sqLiteDatabase;

    private Context context;

    public SQLiteAdapter(Context c){
        context = c;
    }

    public SQLiteAdapter openToRead() throws android.database.SQLException {
        sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
        sqLiteDatabase = sqLiteHelper.getReadableDatabase();
        return this;    
    }

    public SQLiteAdapter openToWrite() throws android.database.SQLException {
        sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
        sqLiteDatabase = sqLiteHelper.getWritableDatabase();
        return this;    
    }

    public void close(){
        sqLiteHelper.close();
    }

    public long insert(String content,String content1,String content2,String content3){

        ContentValues contentValues = new ContentValues();
        contentValues.put(KEY_Name, content.toString());
        contentValues.put(KEY_Number, content1.toString());
        contentValues.put(KEY_Date, content2.toString());
        contentValues.put(KEY_Time, content3.toString());
        return sqLiteDatabase.insert(MYDATABASE_TABLE, null, contentValues);


    }

    public int deleteAll(){
        return sqLiteDatabase.delete(MYDATABASE_TABLE, null, null);
    }

    public Cursor queueAll(){
        String[] columns = new String[]{KEY_ID, KEY_Name, KEY_Number, KEY_Date, KEY_Time};
        Cursor cursor = sqLiteDatabase.query(MYDATABASE_TABLE, columns,null, null, null, null, null);

        return cursor;
    }


    public Cursor getAllData()
    {
        SQLiteDatabase db= sqLiteHelper.getWritableDatabase();
        Cursor res=db.rawQuery("select * from "+MYDATABASE_TABLE,null);

        return res;
    }

    public class SQLiteHelper extends SQLiteOpenHelper {

        public SQLiteHelper(Context context, String name,
                CursorFactory factory, int version) {
            super(context, name, factory, version);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            db.execSQL(SCRIPT_CREATE_DATABASE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub

             // Drop older table if existed
            db.execSQL("DROP TABLE IF EXISTS " + MYDATABASE_TABLE);

            // Create tables again
            onCreate(db);

        }

    }

}

与此相关的

= Android将Listview数据存储在SQlite数据库中,并在创建活动时在Listview中检索数据

我该如何设置此问题,或者如何根据ID读取行,然后设置为Listview ..请帮助我..

how can i set this problem or how can i read rows according to ids and then set to listview .. please help me guys..

推荐答案

您正在列表视图中使用多个适配器.

You are using multiple adapters in your list view.

listview.setAdapter(new MyNotiAdapter(noticall.this, adi,adi1,adi2,adi3));

以后

listview.setAdapter(cursorAdapter);

是的,代码运行时,您看到了一些意外的结果.

While, yes, the code runs, you are seeing some unexpected results.

例如,第二张图像看起来像是在一行中显示一个Arraylist,而不是每行显示一个元素.

For example, that second image looks like you are displaying an Arraylist in one row instead of an element per row.

这可能是由于您在此行中将某些数组列表设为字符串

And that is probably caused by this line where you toString some arraylists

mySQLiteAdapter.insert(myrows.toString(),time1.toString(),name1.toString(),number1.toString());

因此,我的建议是使用一个适配器(由于您使用的是SQLite,因此可能只是一个CursorAdapter)来显示数据.并且setAdapteronCreate内只能执行一次,而无需再次设置.您只需要重新加载光标.

So, my suggestion is use one adapter (probably just a CursorAdapter since you are using SQLite) to display your data. And you can setAdapter only once inside onCreate and never need to set it again. You only reload the cursor.

另一件事要注意.将其添加到适配器后,请勿在光标上进行迭代.因为适配器读取游标并显示其内容,所以您稍后将耗尽迭代器.

Another thing to note. Don't iterate on the cursor after you add it to an adapter. Because the adapter reads the cursor and displays its contents, then you are later exhausting the iterator.

Cursor cursor = mySQLiteAdapter.getAllData();
startManagingCursor(cursor);
// ...
SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(noticall.this, R.layout.row2, cursor, from, to);

while (cursor.moveToNext()){ // <--- This is bad

这篇关于Android在列表视图中设置sqlite数据库值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆