android:如何将数据从sql server保存到android';s sqlite数据库
我正在尝试创建一个从sql server获取数据并在listview中显示的应用程序,但我还想将json保存在sqlite数据库中。为此,我创建了以下SqliteDB类,但我不知道如何将json数据发送到此类android:如何将数据从sql server保存到android';s sqlite数据库,android,sql-server,json,sqlite,Android,Sql Server,Json,Sqlite,我正在尝试创建一个从sql server获取数据并在listview中显示的应用程序,但我还想将json保存在sqlite数据库中。为此,我创建了以下SqliteDB类,但我不知道如何将json数据发送到此类 public class SqliteDB { public static final String KEY_ID = "id"; public static final String KEY_NAME = "name"; private static fina
public class SqliteDB {
public static final String KEY_ID = "id";
public static final String KEY_NAME = "name";
private static final String TAG = "DBAdapter";
private static final String DATABASE_NAME = "SQLiteDB";
private static final String TABLE_NAME = "departmentList";
private static final int DATABASE_VERSION = 1;
private static final String CREATE_TABLE =
"create table departmentList (id text primary key autoincrement, name text not null);";
private final Context context;
private DatabaseHelper DBHelper;
private SQLiteDatabase db;
public SqliteDB(Context ctx) {
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL(CREATE_TABLE);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS sample");
onCreate(db);
}
}
//---open SQLite DB---
public SqliteDB open() throws SQLException {
db = DBHelper.getWritableDatabase();
return this;
}
//---close SQLite DB---
public void close() {
DBHelper.close();
}
//---insert data into SQLite DB---
public long insert(String name) {
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_NAME, name);
return db.insert(TABLE_NAME, null, initialValues);
}
//---Delete All Data from table in SQLite DB---
public void deleteAll() {
db.delete(TABLE_NAME, null, null);
}
//---Get All Contacts from table in SQLite DB---
public Cursor getAllData() {
return db.query(TABLE_NAME, new String[] {KEY_NAME},
null, null, null, null, null);
}
}
类,该类接收json响应
public class DeptActivity extends Activity{
ArrayAdapter<String> adapter;
ListView listv;
Context context;
ArrayList<String> data;
SqliteDB sqlite;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dept);
sqlite = new SqliteDB(DeptActivity.this);
setupActionBar();
data = new ArrayList<String>();
listv = (ListView) findViewById(R.id.lv_dept);
context = this;
adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, data);
listv.setAdapter(adapter);
Toast.makeText(this,"Loading Please Wait..",Toast.LENGTH_SHORT).show();
new AsyncLoadDeptDetails().execute();
}
public class DeptActivity扩展活动{
阵列适配器;
ListView-listv;
语境;
阵列列表数据;
SqliteDB-sqlite;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u dept);
sqlite=newsqlitedb(DeptActivity.this);
setupActionBar();
数据=新的ArrayList();
listv=(ListView)findViewById(R.id.lv\U部门);
上下文=这个;
adapter=new ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,数据);
listv.setAdapter(适配器);
Toast.makeText(这是“正在加载请稍候…”),Toast.LENGTH_SHORT.show();
新建AsyncLoadDeptDetails().execute();
}
公共类AsyncLoadDeptDetails扩展
异步任务>{
ArrayList deptTable=null
@Override
public ArrayList<DeptTable> doInBackground(Void... params) {
// TODO Auto-generated method stub
RestAPI api = new RestAPI();
try {
JSONObject jsonObj = api.GetDepartmentDetails();
JSONParser parser = new JSONParser();
Log.i( "department list", jsonObj.toString());
deptTable = parser.parseDepartment(jsonObj);
sqlite();
} catch (Exception e) {
}
return deptTable;
}
//method to insert data json in sqlite
private void sqlite() {
// TODO Auto-generated method stub
sqlite.open();
for(int i=0; i<deptTable.size(); i++) {
sqlite.insert(deptTable.get(i).toString());
}
sqlite.close();
}
@Override
protected void onPostExecute(ArrayList<DeptTable> result) {
// TODO Auto-generated method stub
for (int i = 0; i < result.size(); i++) {
data.add(result.get(i).getNo() + " " + result.get(i).getName());
}
adapter.notifyDataSetChanged();
Toast.makeText(context,"Loading Completed",Toast.LENGTH_SHORT).show();
}
@覆盖
公共ArrayList doInBackground(无效…参数){
//TODO自动生成的方法存根
RestAPI api=new RestAPI();
试一试{
JSONObject jsonObj=api.GetDepartmentDetails();
JSONParser=新的JSONParser();
Log.i(“部门列表”,jsonObj.toString());
deptTable=parser.parseDepartment(jsonObj);
sqlite();
}捕获(例外e){
}
返回deptTable;
}
//方法在sqlite中插入数据json
私有void sqlite(){
//TODO自动生成的方法存根
sqlite.open();
对于(int i=0;i我怀疑没有调用SQLiteOpenHelper的onCreate方法。这就是为什么没有创建DB表的原因。请在DatabaseHelper的onCreate中放置一个日志,检查它是否正在打印。还可以尝试将SQLiteOpenHelper用作非静态内部类,即删除SQLiteDB类并使用DatabaseHelperClass Constructtor直接创建。public void onCreate(SQLiteDatabase db){
试一试{
db.execSQL(创建_表);
}捕获(SQLE异常){
e、 printStackTrace();
}
}
问题是您的CREATE\u TABLE
语句有一个错误,但是onCreate
函数抑制了这个错误,因此SQLiteOpenHelper
假设它成功了,并且数据库可用
删除该尝试
/捕获
,然后删除应用程序的数据(以强制再次执行onCreate
)。
然后修复错误消息中出现的错误
Error inserting name=com.example.db_client.DeptTable@b3e53870
android.database.sqlite.SQLiteException: no such table: departmentList (code 1): , while compiling: INSERT INTO departmentList(name) VALUES (?)
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
at com.example.db_client.SqliteDB.insert(SqliteDB.java:73)
at com.example.db_client.DeptActivity$AsyncLoadDeptDetails.sqlite(DeptActivity.java:91)
at com.example.db_client.DeptActivity$AsyncLoadDeptDetails.doInBackground(DeptActivity.java:68)
at com.example.db_client.DeptActivity$AsyncLoadDeptDetails.doInBackground(DeptActivity.java:1)