我有一个ListActivity,我在其中填充一个对话框,用于选择联系信息和选择日期和时间。为了在那个时间生成通知。我已经完成了它,并且所有数据都显示在ListView中。
所以我想做的是当用户选择并设置listView行数据应存储在数据库(sqlite)中的通知时间。当用户启动活动时,可以向用户显示存储的数据。所以用户可以看到他们的通知计划..
现在我已经实现了listViews我不知道如何在sqlite中存储和检索数据..我已经搜索并尝试了很多教程,但在这种情况下没有任何工作。
我正在分享我的代码有点粗糙。但我会突出显示数据的位置,以及如何将数据存储到数据库中。
这是我的通知类:
TextView txtmylink;
GoogleApiClient mGoogleApiClient;
Location mLastLocation;
Button getlastlocation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtmylink = (TextView) findViewById(R.id.mylink);
getlastlocation = (Button) findViewById(R.id.getlastlocation);
getlastlocation.setOnClickListener(getlastlocationOnClickListener);
// Create an instance of GoogleAPIClient.
if (mGoogleApiClient == null) {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
}
View.OnClickListener getlastlocationOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mGoogleApiClient != null) {
if (mGoogleApiClient.isConnected()) {
getMyLocation();
} else {
Toast.makeText(MainActivity.this,
"!mGoogleApiClient.isConnected()", Toast.LENGTH_LONG).show();
}
} else {
Toast.makeText(MainActivity.this,
"mGoogleApiClient == null", Toast.LENGTH_LONG).show();
}
}
};
private void getMyLocation() {
try {
/* code should explicitly check to see if permission is available
(with 'checkPermission') or explicitly handle a potential 'SecurityException'
*/
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (mLastLocation != null) {
txtmylink.setText(String.valueOf("http://maps.google.com/maps?q=") +
String.valueOf(mLastLocation.getLatitude()) +
String.valueOf(",")+ String.valueOf(mLastLocation.getLongitude()));
} else {
Toast.makeText(MainActivity.this,
"mLastLocation == null",
Toast.LENGTH_LONG).show();
}
} catch (SecurityException e) {
Toast.makeText(MainActivity.this,
"SecurityException:\n" + e.toString(),
Toast.LENGTH_LONG).show();
}
}
@Override
protected void onStart() {
mGoogleApiClient.connect();
super.onStart();
}
@Override
protected void onStop() {
mGoogleApiClient.disconnect();
super.onStop();
}
@Override
public void onConnected(@Nullable Bundle bundle) {
getMyLocation();
}
@Override
public void onConnectionSuspended(int i) {
Toast.makeText(MainActivity.this,
"onConnectionSuspended: " + String.valueOf(i),
Toast.LENGTH_LONG).show();
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Toast.makeText(MainActivity.this,
"onConnectionFailed: \n" + connectionResult.toString(),
Toast.LENGTH_LONG).show();
}
我的SQLiteAdapter类:
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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.notify);
listview = (ListView) findViewById(android.R.id.list);
listview.setDividerHeight(2);
// mySQLiteAdapter = new SQLiteAdapter(noticall.this);
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;
Log.e("Timeee", Time+"");
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++;
}
});
// if(adi!=null)
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()]);
mySQLiteAdapter = new SQLiteAdapter(noticall.this);
mySQLiteAdapter.openToWrite();
mySQLiteAdapter.deleteAll();
mySQLiteAdapter.insert(adi,adi1,adi2,adi3);
listview.setAdapter(new MyNotiAdapter(noticall.this, adi,adi1,adi2,adi3));
x++;
mySQLiteAdapter.close();
}
public void read_db(){
/*
* Open the same SQLite database
* and read all it's content.
*/
Log.e("jsahbdv", "munda agaya medaan men hay jamaalo");
mySQLiteAdapter = new SQLiteAdapter(this);
mySQLiteAdapter.openToRead();
Cursor cursor = mySQLiteAdapter.queueAll();
startManagingCursor(cursor);
String[] from = new String[]{SQLiteAdapter.KEY_Name,SQLiteAdapter.KEY_Number,SQLiteAdapter.KEY_Date,SQLiteAdapter.KEY_Time};
int[] to = new int[]{R.id.person,R.id.edu,R.id.label,R.id.tym};
SimpleCursorAdapter cursorAdapter =
new SimpleCursorAdapter(this, R.layout.row2, cursor, from, to);
listview.setAdapter(cursorAdapter);
mySQLiteAdapter.close();
}
}
我的观点是,当用户为通知添加列表行时,它也应该插入到数据库中,稍后当活动启动时,必须显示存储的通知数据,之后我将实现从列表视图和数据库中删除它。
表格应包含以下列:
| ID | NAME | NUMBER |日期|时间|
如果有人可以帮我提供示例代码或重构此代码以获得成功。我在数据库方面的技能真的很弱......这将是值得赞赏的。感谢
cmon们,我真的需要帮助。
错误
public class SQLiteAdapter {
public static final String MYDATABASE_NAME = "MY_DATABASE";
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 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
}
}
}
答案 0 :(得分:0)
@ Addi.Star请参阅以下程序,
-SQLiteHelper
public static final String DATABASE_NAME="student.db";
public static final String TABLE_NAME="stud_info";
public static final String col1="ID";
public static final String col2="NAME";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 1);
//SQLiteDatabase db=this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + TABLE_NAME + " ( Id INTEGER PRIMARY KEY,NAME TEXT ) ");
Log.e("DB CREATE","DATABASE CREATE");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public boolean insertData(String id,String name){
SQLiteDatabase db=this.getWritableDatabase();
ContentValues contex=new ContentValues();
contex.put(col1,id);
contex.put(col2,name);
long result=db.insert(TABLE_NAME,null,contex);
if(result==-1)
{
return false;
}else{
return true;
}
}
public Cursor getAllData()
{
SQLiteDatabase db=this.getWritableDatabase();
Cursor res=db.rawQuery("select * from "+TABLE_NAME,null);
return res;
}
- 这是类或适配器中的函数,您可以从SQlite数据库中检索数据
Cursor res=myDb.getAllData();
if(res.getCount() == 0){
ShowMessage("Error", "NOthing found");
return;
}
StringBuffer strBfr=new StringBuffer();
while (res.moveToNext()){
strBfr.append("Id :"+ res.getString(0) + "\n");
strBfr.append("Name:" + res.getString(1) + "\n");
}
ShowMessage("Data", strBfr.toString());
答案 1 :(得分:-1)
使用你的应用程序的RootExplorer打开数据库,看看,如果数据是否插入,可能是错误是由于SELECT时没有行重新调整。