我需要在我的Android应用程序中实现一个模块,该模块从我自己的网站获取一些文本内容(不在浏览器上显示,但由应用程序处理)。
该文本内容将存储在数据库中(MySQL?)。
我唯一的问题是我之前从未做过这样的事情(虽然我熟悉基本的SQL),所以我不确定什么是一个很好的有条理的方法来解决这个问题,我甚至都不知道从哪里开始。
我应该从头开始创建MySQL数据库并开始围绕它编写PHP吗?
是否有一个框架或包装器已经面向与Android应用程序通信,让我专注于我需求的特性?
您认为什么是一个好的起点?
答案 0 :(得分:6)
首先,您必须为您的应用程序开发联系点(WebService,REST服务或任何适合您的需求)。就我而言,我正在使用生成JSON响应的PHP脚本。
这是一个简单的PHP脚本,它连接到数据库并输出JSON(json_encode method)响应:
<?php
$link = mysqli_connect("localhost", "dbuser", "dbpassword", "database");
$response = array();
$pass = mysqli_query("select * from table");
while($data = mysqli_fetch_object($pass))
{
array_push($response, array(
"my_field" => $data->my_field
));
}
echo json_encode($response);
mysqli_close($link);
&GT;
该脚本将输出如下的JSON响应:
[{"my_field":1}]
当您的应用程序通过HTTP POST或GET响应请求数据时,您将使用库解析答案。由于我在PHP方面使用JSON,我目前正在为我的项目使用GSON。
要从Android应用程序请求JSON数据,您可以使用我带到某处的RestClass(不记得了),但这里是代码:
public class RestClient
{
private ArrayList <NameValuePair> params;
private ArrayList <NameValuePair> headers;
private String url;
private int responseCode;
private String message;
private String response;
public enum RequestMethod
{
GET,
POST
}
public String getResponse() {
return response;
}
public String getErrorMessage() {
return message;
}
public int getResponseCode() {
return responseCode;
}
public RestClient(String url)
{
this.url = url;
params = new ArrayList<NameValuePair>();
headers = new ArrayList<NameValuePair>();
}
// -------------------------------------------------------------------------------
// Various methods.
// -------------------------------------------------------------------------------
/**
* Add a parameter to the request (pair, name/value).
* @param name Name of the parameter (ex: &name=)
* @param value Value of the parameter (ex: &name=value).
*/
public void AddParam(String name, String value)
{
params.add(new BasicNameValuePair(name, value));
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/**
* Add a header to the request (if needed).
* @param name Name of the header. (ex: Content-Type)
* @param value Value of the header. (ex: Content-Type = text/html).
*/
public void AddHeader(String name, String value)
{
headers.add(new BasicNameValuePair(name, value));
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/**
* Fetch the HTTP content via POST or GET.
* @param method Method to be used.
* @throws Exception Exception to be catched in case of a network problem.
*/
public void Execute(RequestMethod method) throws Exception
{
switch(method) {
case GET:
{
//add parameters
String combinedParams = "";
if(!params.isEmpty()){
combinedParams += "?";
for(NameValuePair p : params)
{
String paramString = p.getName() + "=" + URLEncoder.encode(p.getValue(),"UTF-8");
if(combinedParams.length() > 1)
{
combinedParams += "&" + paramString;
}
else
{
combinedParams += paramString;
}
}
}
HttpGet request = new HttpGet(url + combinedParams);
//add headers
for(NameValuePair h : headers)
{
request.addHeader(h.getName(), h.getValue());
}
executeRequest(request, url);
break;
}
case POST:
{
HttpPost request = new HttpPost(url);
//add headers
for(NameValuePair h : headers)
{
request.addHeader(h.getName(), h.getValue());
}
if(!params.isEmpty()){
request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
}
executeRequest(request, url);
break;
}
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/**
* Alternative method to execute the HTTP request.
* @param request The HTTP request object to be used.
* @param url HTTP url.
*/
private void executeRequest(HttpUriRequest request, String url)
{
HttpClient client = new DefaultHttpClient();
HttpResponse httpResponse;
try {
httpResponse = client.execute(request);
responseCode = httpResponse.getStatusLine().getStatusCode();
message = httpResponse.getStatusLine().getReasonPhrase();
HttpEntity entity = httpResponse.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
response = convertStreamToString(instream);
// Closing the input stream will trigger connection release
instream.close();
}
} catch (ClientProtocolException e) {
client.getConnectionManager().shutdown();
e.printStackTrace();
} catch (IOException e) {
client.getConnectionManager().shutdown();
e.printStackTrace();
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/**
* Private method. Convert an HTTP stream to a string stream.
* @param is InputStream to be converted.
* @return String to be used.
*/
private static String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
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();
}
}
然后在您的Android应用程序上,您可以像这样实例化RestClient类(您甚至可以向查询添加POST或GET参数):
RestClient c = new RestClient("http://www.myserver.com/json.php");
c.AddParam("my_field_value", 1);
try
{
c.Execute(RequestMethod.POST);
// Here you can parse the JSON with an instance of Gson class.
Gson jsonObject = new Gson();
String jsonOutput = jsonObject.toJson(c.getResponse());
// Do whatever you need with the data.
}
catch (Exception e)
{
e.printStackTrace();
}
瞧!您可以使用从Android应用程序中使用PHP脚本创建的JSON数据。不要忘记将android.permission.INTERNET添加到AndroidManifest.xml。否则,您的应用程序将无法与您的PHP脚本通信。
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
祝你好运。
答案 1 :(得分:3)
本教程有帮助吗? Connecting to MySQL database
答案 2 :(得分:3)
这可以通过多种方式完成,您可以做一些非常简单的事情,但随着您的进步并开始从服务器向您的应用发送更多信息,您需要实施更强大的功能。
虽然@Robert的回答是有效的,但我相信对于手机而言,使用JSON使用RESTful网络服务要好得多。
您可以根据需要对Web服务进行编程,我建议(如果您可以在java中进行服务器端编程),请查看GSON这是一个使用JSON的优秀库。通过使用JSON对象,您可以将所需的所有信息转换为字符串,然后让移动电话将其转换为Java对象。您可以随心所欲地执行任何操作,以便在UI中显示它或将其存储在数据库中。
答案 3 :(得分:1)
我最近这样做是为了检索我的信息而调用.Net网络服务。我从我的Android应用程序使用KSoap2调用了Web服务。在搜索时我找不到任何框架来使它更容易。最后它实际上变得相当容易。以下是您的出发点:
http://www.helloandroid.com/tutorials/using-ksoap2-android-and-parsing-output-data