【问题标题】:How to add data to existing database in my android app?如何将数据添加到我的 android 应用程序中的现有数据库?
【发布时间】:2016-08-18 11:53:46
【问题描述】:

我们创建了一个带有 Web 服务的应用程序。我们的数据类型是 json。 android 应用程序可以从 IP 地址服务器获取数据。 但它们没有出现在数据库中。我们该如何解决?我们的代码如下。

DatabaseHelper 类

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;

public class DatabaseHelper extends SQLiteOpenHelper {

        String DB_PATH = null;
        private static String DB_NAME = "bosdata.db";
        private SQLiteDatabase myDataBase;
        private final Context myContext;

        public DatabaseHelper(Context context) {
           super(context, DB_NAME, null, 10);
            this.myContext = context;
           this.DB_PATH = "/data/data/" + context.getPackageName() + "/" + "databases/";
            //Log.e("Path 1", DB_PATH);
        }
    //
    //
        public void createDataBase() throws IOException {
            boolean dbExist = checkDataBase();
            if (dbExist) {
            } else {
                this.getReadableDatabase();
                try {
                    copyDataBase();
                } catch (IOException e) {
                    throw new Error("Error copying database");
                }
            }
        }

        private boolean checkDataBase() {
            SQLiteDatabase checkDB = null;
            try {
                String myPath = DB_PATH + DB_NAME;
                checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
            } catch (SQLiteException e) {
            }
            if (checkDB != null) {
                checkDB.close();
            }
            return checkDB != null ? true : false;
        }

        private void copyDataBase() throws IOException {
            InputStream myInput = myContext.getAssets().open(DB_NAME);
            String outFileName = DB_PATH + DB_NAME;
            OutputStream myOutput = new FileOutputStream(outFileName);
            byte[] buffer = new byte[10];
            int length;
            while ((length = myInput.read(buffer)) > 0) {
                myOutput.write(buffer, 0, length);
            }
            myOutput.flush();
            myOutput.close();
            myInput.close();

        }

        public void openDataBase() throws SQLException {
            String myPath = DB_PATH + DB_NAME;
            myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);

        }

        @Override
        public synchronized void close() {
            if (myDataBase != null)
                myDataBase.close();
            super.close();
        }


        @Override
        public void onCreate(SQLiteDatabase db) {
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            if (newVersion > oldVersion)
                try {
                    copyDataBase();
                } catch (IOException e) {
                    e.printStackTrace();

                }
        }

        public ArrayList<Liste_Model> get_All_Parts() {
            openDataBase();
            ArrayList<Liste_Model> arr = new ArrayList<Liste_Model>();


            Cursor c = myDataBase.query("db4OptimumOptimumSiraliRota", null, null, null, null, null, null);
            if (c != null) {
                if (c.moveToNext()) {
                    do {
                        Liste_Model model = new Liste_Model();
                        model.setResim_No(c.getString(0));
                        model.setKasa_Yeri(c.getString(1));
                        model.setAraba_Bolme_Yeri(c.getString(2));
                        arr.add(model);
                    } while (c.moveToNext());
                }
            }
            c.close();
            myDataBase.close();
            return arr;
        }

        public void add_SiraliListe(Liste_Model model) {
    SQLiteDatabase myDataBase = this.getWritableDatabase();
            openDataBase();

            ContentValues values = new ContentValues();
            values.put("ResimNo", model.getResim_No().toString());
            values.put("KasaYeri", model.getKasa_Yeri().toString());
            values.put("ArabaBolmeYeri", model.getAraba_Bolme_Yeri().toString());
            myDataBase.insertOrThrow("db4OptimumOptimumSiraliRota", null, values);


            myDataBase.close();

MainActivity 类

public class MainActivity extends AppCompatActivity implements OnClickListener {

    Button bSorgula;
    String resimno= "";
    String kasayeri = "";
    String arababolmeyeri = "";


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

        bSorgula = (Button) findViewById(R.id.bSorgula);
        bSorgula.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        new myAsyncTask("Yükleniyor").execute();
    }

    private class myAsyncTask extends AsyncTask<Void, Void, Void> {

        String modalMesaj;
        ProgressDialog dialog;

        JSONObject jsonObject = null;

        public myAsyncTask(String mMesaj) {
            this.modalMesaj = mMesaj;
            this.dialog = new ProgressDialog(MainActivity.this);
        }

        @Override
        protected void onPreExecute() {
            dialog.setMessage(modalMesaj);
            dialog.setIndeterminate(true);
            dialog.setCancelable(false);
            dialog.show();
        }

        @Override
        protected Void doInBackground(Void... params) {



            String url = "http://192.168.163.1:8097/Products.aspx";

            HttpClient httpclient = new DefaultHttpClient();

            HttpGet httpget = new HttpGet(url);

            HttpResponse response;
            try {
                response = httpclient.execute(httpget);

                HttpEntity entity = response.getEntity();

                if (entity != null) {
                    InputStream instream = entity.getContent();
                    String result = convertStreamToString(instream);

                    JSONArray arr = new JSONArray(result);
                    List<String> Liste_Model = new ArrayList<String>();
                    DatabaseHelper databaseHelper = new DatabaseHelper(MainActivity.this);
                    for(int i = 0; i < arr.length(); i++){
                        Liste_Model.add(arr.getJSONObject(i).getString("ResimNo"));
                        Liste_Model.add(arr.getJSONObject(i).getString("KasaYeri"));
                        Liste_Model.add(arr.getJSONObject(i).getString("ArabaBolmeYeri"));

                        Liste_Model model = new Liste_Model();

                        try {
                            databaseHelper.createDataBase();
                            model.setResim_No(arr.getJSONObject(i).getString("ResimNo"));
                            model.setKasa_Yeri(arr.getJSONObject(i).getString("KasaYeri"));
                            model.setAraba_Bolme_Yeri(arr.getJSONObject(i).getString("ArabaBolmeYeri"));

                            databaseHelper.add_SiraliListe(model);
                        } catch (IOException e) {
                            e.printStackTrace();

                        }
                    }



                    instream.close();
                }

            } catch (ClientProtocolException e) {
                Mesaj(e.getMessage());
            } catch (IOException e) {
                Mesaj(e.getMessage());
            } catch (JSONException e) {
                Mesaj(e.getMessage());
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void str) {

            if (dialog.isShowing())
                dialog.dismiss();


        }
    }

    private static String convertStreamToString(InputStream is) {

        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();

        String line ;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }

    private void Mesaj(String s) {

        Toast.makeText(this, s, Toast.LENGTH_LONG).show();
    }

}

列出模型类

public class Liste_Model {
    private String Resim_No;
    private String Kasa_Yeri;
    private String Araba_Bolme_Yeri;

    public String getResim_No() {
        return Resim_No;
    }

    public void setResim_No(String resim_No) {
        Resim_No = resim_No;
    }

    public String getKasa_Yeri() {
        return Kasa_Yeri;
    }

    public void setKasa_Yeri(String kasa_Yeri) {
        Kasa_Yeri = kasa_Yeri;
    }

    public String getAraba_Bolme_Yeri() {
        return Araba_Bolme_Yeri;
    }

    public void setAraba_Bolme_Yeri(String araba_Bolme_Yeri) {
        Araba_Bolme_Yeri = araba_Bolme_Yeri;
    }
}

【问题讨论】:

  • 解释你的代码会有很大帮助。

标签: android database web-services sqlite android-studio


【解决方案1】:

为什么要手动创建数据库路径?您应该改用 DatabaseHelper 的 getWritableDatabase()getReadableDatabase() 方法,如 official manual 中所述。并写更详细的信息为什么你认为它没有被放入数据库,也许你无法正确阅读它?是否有任何错误或崩溃?但首先尝试按照官方文档中给出的方式重写您的代码。

【讨论】:

  • 我们正在为 Sony-Smart EyeGlass 开发一个应用程序,如果我们像我们一样使用 manuel 数据库,我们总是不得不一次又一次地运行 android studio。但是我们不想一直刷新android studio。因为,我们将在工业操作中使用玻璃。实际上,我们可以直接将数据IP地址服务器获取到android studio吗?我认为它可以帮助我们。
  • @TuğçeAcar,我不明白那是什么问题?您从您的 IP 地址获取 Json Array。然后你只需要解析这个Json。使用本手册如何使用JsonReader class 执行此操作希望这就是您要找的。请注意,JsonArray 被 [ ] 包围,而 Json Object 被 { } 包围。实际上,您可以处理所有数据而无需将其保存到数据库中。只需解析(读取)json 并做任何你需要的事情。您还可以将数据保存在一些 ArrayList
  • 是的,你是对的。我将在玻璃屏幕上显示数据而不保存。谢谢。
  • @TuğçeAcar,很高兴它对您有所帮助。不想看起来像自私,但我是 StackOverflow 的新手,所以我需要一些声誉才能让 cmets 受到质疑。因此,如果您将我的回答正确,我将非常感激,当然,如果它对您有帮助的话。此致。如果您对 Json 有任何问题,请告诉我,我们会尽力帮助您。
猜你喜欢
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多