GPS로 위경도를 받을 수 있게 하고 DB에 저장하려고 하려고 합니다.
그런데 처음에는 하나 씩 잘 뜨다가 껐다 다시 켜면 테이블이 2개가 되는지 같은게 2개씩 뜨고 또 껐다 켜면 3개 씩 뜨고
이런 식입니다.....왜 그러는지 잘 모르겠어요... DB를 처음 건드려 보는거라...가르침 부탁드립니다..ㅜㅜ
/////////////// Main Activity/////////////////////////
public class MainActivity extends Activity {
TextView tx;
String provider = LocationManager.GPS_PROVIDER;
LocationManager lc;
DBase DBHelper;
SQLiteDatabase db;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tx = (TextView) findViewById(R.id.textView1);
Criteria criteria = new Criteria();
criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);
criteria.setAccuracy(Criteria.ACCURACY_FINE); // 정확도
criteria.setPowerRequirement(Criteria.POWER_LOW); // 전원 소비량
// db셋팅부----------------------------------------------------------
DBHelper = new DBase(this);
db = DBHelper.getWritableDatabase();
// gps셋팅부--------------------------------------------------------
// LocationManager 생성
lc = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// 사용할 GPS Provider
provider = lc.getBestProvider(criteria, true);
// Latitude, Longitude 를 저장하는 Location 객체
// 최근 갱신된 GPS값을 받아옴
// Location location = lc.getLastKnownLocation(provider);
// Latitude, Longitude를 TextView에 출력하는 showGPS 메소드 호출
lc.requestLocationUpdates(provider, 10000, 1, new LocationListener() {
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
// 업데이트 조건이 발동되면 showGPS 메소드 호출
public void onLocationChanged(Location location) {
db.execSQL("INSERT INTO position(long,lat) VALUES ('"+
Double.toString(location.getLongitude()) +"','"
+ Double.toString(location.getLatitude()) +"');");
String str = "";
Cursor cursor;
cursor = db.rawQuery("SELECT * FROM position", null);
Log.d("dbtest", "db객체에서 쿼리 실행후 결과값 커서에 저장");
Log.d("dbtest", "while문 실행준비");
while (cursor.moveToNext()) {
str += cursor.getString(cursor.getColumnIndex("long"));
str += "\t\t\t";
str += cursor.getString(cursor.getColumnIndex("lat"));
str += "\n";
tx.setText(str);
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
db.execSQL("DROP TABLE IF EXISTS position");
db.execSQL("CREATE TABLE position(_no INTEGER PRIMARY KEY AUTOINCREMENT, " +
"long text, lat text);");
}
}
////////////// DB class/////////////////////////////////
public class DBase extends SQLiteOpenHelper {
public DBase(Context context) {
super(context, "running_man", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE position(_no INTEGER PRIMARY KEY AUTOINCREMENT, " +
"long text, lat text);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS position");
onCreate(db);
}
}
public void onLocationChanged(Location location) {
db.execSQL("INSERT INTO position(long,lat) VALUES ('"+
Double.toString(location.getLongitude()) +"','"
+ Double.toString(location.getLatitude()) +"');");
님이 위치가 갱신될 때 그냥 Insert만 하셨지, 테이블을 update 한 것이 아닌데요. 키값이 될만한 칼럼을 잡으셔서 같은 값이 들어오면 업데이트 하시고 새로운 값이면 insert 하시는 로직을 쓰셔야 맞지 않을까요? 아마도 같은 새로운 위치일 경우만 insert하실려고 하는 걸로 보이니까 latitude, longitude를 검사하셔셔 처리하시면 될 듯합니다.
테이블 구조가
_id
latitude
longitude
updatetime
이런 구조로 가시면 될 듯...