package com.example.test.databaseapp;
import java.sql.DriverManager;
import java.sql.SQLException;
import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
public class MainActivity extends Activity {
static final String url = "jdbc:mysql://x.x.x.x:xxxx/DBNAME";
static final String user = "client";
static final String pass = "password";
public static List<objClass> objList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Download(MainActivity.this, internalUrl).execute(); //async task for getting data from db
}
}
@Path("/product")
public class ProductRestService {
@GET
@Path("/list")
@Produces(MediaType.APPLICATION_JSON)
public List<Product> getProducts() {
List<Product> productList = new ArrayList<>();
Connection con = ...; //retrieve your database connection
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name FROM product");
while (rs.next()) {
Product product = new Product();
product.setId(rs.getInt("id"));
product.setName(rs.getString("name"));
productList.add(product);
}
//ALWAYS close the resources
rs.close();
stmt.close();
conn.close();
return productList;
}
}
public class ProductDao {
public List<Product> getProducts() {
List<Product> productList = new ArrayList<>();
Connection con = ...; //retrieve your database connection
//the rest of the code explained above...
return productList;
}
}
@Path("/product")
public class ProductRestService {
@GET
@Path("/list")
@Produces(MediaType.APPLICATION_JSON)
public List<Product> getProducts() {
ProductDao productDao = new ProductDao();
return productDao.getProducts();
}
}
3条答案
按热度按时间zf9nrax11#
可以这样做,但不建议这样做。我以前做过,因为我和你在同一条船上,所以我将分享一些代码。
我专门使用了这个jdbc jar:https://www.dropbox.com/s/wr06rtjqv0q1vgs/mysql-connector-java-3.0.17-ga-bin.jar?dl=0
现在是代码:
现在开始我的异步任务:
请确保在清单中包含internet权限。如果您有任何问题,请随时询问有关我的代码的更多问题。
j13ufse22#
你不能从android本地访问mysql数据库。编辑:实际上您可能可以使用jdbc,但不建议使用它(或者可能不起作用?)。。。请参见android jdbc不工作:驱动程序上的classnotfoundexception
看见
http://www.helloandroid.com/tutorials/connecting-mysql-database
http://www.basic4ppc.com/forum/basic4android-getting-started-tutorials/8339-connect-android-mysql-database-tutorial.html
android无法直接连接到数据库服务器。因此,我们需要创建一个简单的web服务,将请求传递到数据库并返回响应。
http://codeoncloud.blogspot.com/2012/03/android-mysql-client.html
对于大多数[好的]用户来说,这可能没问题。但是想象一下你有一个黑客控制了你的程序。我已经反编译了我自己的应用程序和它可怕的我所看到的。如果他们把你的用户名/密码输入你的数据库并造成严重破坏怎么办?糟糕。
9jyewag03#
基本上:您可以连接到mysql(或任何您使用的)服务器,但不应该直接从android应用程序进行连接。
原因:
android应用程序可以反编译,客户端将拥有访问您的数据库的凭据。如果使用正确的黑客工具,如回溯,那么这个恶意客户端可以访问,连接和利用数据库中的数据。
如果您的应用程序适用于世界各地的客户机,那么客户机应该为每个操作或一组操作打开并维护到数据库的连接。打开物理数据库连接需要很多时间,即使您的pc客户端位于数据库引擎服务器旁边的lan中。现在,想象一下从世界另一端的一个国家(如中国或日本)或从南美的一个国家(如巴西或秘鲁)(我居住的地方)开通连接。
出于这两个原因,我可以想出,这是一个坏主意,甚至试图连接到mysql或任何其他数据库引擎直接从您的手机设备。
如何解决这个问题?使用面向服务的体系结构,其中至少有两个应用程序:
服务提供商应用程序。这个应用程序将创建和发布web服务(最好是restful),并且可以建立策略来使用web服务,比如用户身份验证和授权。此应用程序还将连接到数据库并对其执行crud操作。
服务使用者应用程序。这将是您的android(或任何其他移动)应用程序。
从你的问题来看,你把重点放在了第一点上。正如我在评论中所说的,您可以用java创建一个web应用程序,在那里创建一个restful服务,它可以归结为一个pojo(纯旧java对象),每个服务都有一个方法。在这个方法中,因为它毕竟是纯java,所以可以添加其他功能,比如jdbc用法。
下面是一个使用jersey、jackson(json库)和jdbc的启动示例:
您可以在mkyong's或vogella's之类的教程中查看javaweb应用程序的进一步配置(这个答案中的信息太多了)。
注意,这样这个应用程序就可以发展成一个分层的应用程序,jdbc代码将放在dao类中,然后
ProductRestService
类将通过这个dao类访问数据库。下面是另一个启动示例:您可以将其他更改应用于此项目,也可以应用于正在发展的项目。
你能告诉我php在这里做什么吗(如果我用php开发)
不用用java编写服务提供者应用程序(如上所示),可以用php编写。或者在python、ruby、c#、scala或任何其他为您提供此技术的编程语言中。同样,我不确定您正在阅读什么样的教程,但是应该在某个地方解释一下,并解释一下,对于该教程的目的,您将使用php创建服务。如果您觉得用java编写这些服务比用php或任何其他语言编写服务更舒服,那么就没有问题了。你的android应用程序并不关心使用哪种技术来生成web服务,它只关心使用这些服务,并且可以使用来自这些服务的数据。